从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述Redis数据类型大全:“5种基础”数据类型+“3种特殊”数据类型相关的知识,希望能为你提供帮助。
一、“5种基础”数据类型
文章图片
1.1 Redis数据结构简介首先对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。
文章图片
文章图片
1.2 基础数据结构详解1.2.1 String字符串String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
- 图例
文章图片
- 命令使用
文章图片
- 命令执行
127.0.0.1:6379>
set hello world
OK
127.0.0.1:6379>
get hello
"world"
127.0.0.1:6379>
del hello
(integer) 1
127.0.0.1:6379>
get hello
(nil)
127.0.0.1:6379>
get counter
"2"
127.0.0.1:6379>
incr counter
(integer) 3
127.0.0.1:6379>
get counter
"3"
127.0.0.1:6379>
incrby counter 100
(integer) 103
127.0.0.1:6379>
get counter
"103"
127.0.0.1:6379>
decr counter
(integer) 102
127.0.0.1:6379>
get counter
"102"
- 实战场景
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
- session:常见方案spring session + redis实现session共享
- 图例
文章图片
- 命令使用
文章图片
- 使用列表的技巧
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
- 命令执行
127.0.0.1:6379>
lpush mylist 1 2 ll ls mem
(integer) 5
127.0.0.1:6379>
lrange mylist 0 -1
1) "mem"
2) "ls"
3) "ll"
4) "2"
5) "1"
127.0.0.1:6379>
lindex mylist -1
"1"
127.0.0.1:6379>
lindex mylist 10# index不在 mylist 的区间范围内
(nil)
- 实战场景微博
- TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
- 消息队列
- 图例
文章图片
- 命令使用
文章图片
- 命令执行
127.0.0.1:6379>
sadd myset hao hao1 xiaohao hao
(integer) 3
127.0.0.1:6379>
smember myset
1) "xiaohao"
2) "hao1"
3) "hao"
127.0.0.1:6379>
sismember myset hao
(integer) 1
- 实战场景
- 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
- 点赞,或点踩,收藏等,可以放到set中实现
- 图例
文章图片
- 命令使用
文章图片
- 命令执行
127.0.0.1:6379>
hset user name1 hao
(integer) 1
127.0.0.1:6379>
hset user email1 hao@163.com
(integer) 1
127.0.0.1:6379>
hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "hao@163.com"
127.0.0.1:6379>
hget user user
(nil)
127.0.0.1:6379>
hget user name1
"hao"
127.0.0.1:6379>
hset user name2 xiaohao
(integer) 1
127.0.0.1:6379>
hset user email2 xiaohao@163.com
(integer) 1
127.0.0.1:6379>
hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "hao@163.com"
5) "name2"
6) "xiaohao"
7) "email2"
8) "xiaohao@163.com"
- 实战场景
- 缓存: 能直观,相比string更节省空间,的维护缓存信息,如用< typo data-origin="能" ignoretag="true"> 户< /typo> 信息,视频信息等
- 图例
文章图片
- 命令使用
127.0.0.1:6379>
zadd myscoreset 100 hao 90 xiaohao
(integer) 2
127.0.0.1:6379>
ZRANGE myscoreset 0 -1
1) "xiaohao"
2) "hao"
127.0.0.1:6379>
ZSCORE myscoreset hao
"100"
- 实战场景
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行
- 什么是基数?
- HyperLogLogs 基数统计用来解决什么问题?
- 它的优势体现在哪?
- 相关命令使用
127.0.0.1:6379>
pfadd key1 a b c d e f g h i# 创建第一组元素
(integer) 1
127.0.0.1:6379>
pfcount key1# 统计元素的基数数量
(integer) 9
127.0.0.1:6379>
pfadd key2 c j k l m e g a# 创建第二组元素
(integer) 1
127.0.0.1:6379>
pfcount key2
(integer) 8
127.0.0.1:6379>
pfmerge key3 key1 key2# 合并两组:key1 key2 ->
key3 并集
OK
127.0.0.1:6379>
pfcount key3
(integer) 13
2.2 Bitmap (位存储)
- 用来解决什么问题?
如果存储一年的打卡状态需要多少内存呢? 365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
- 相关命令使用
127.0.0.1:6379>
setbit sign 0 1
(integer) 0
127.0.0.1:6379>
setbit sign 1 1
(integer) 0
127.0.0.1:6379>
setbit sign 2 0
(integer) 0
127.0.0.1:6379>
setbit sign 3 1
(integer) 0
127.0.0.1:6379>
setbit sign 4 0
(integer) 0
127.0.0.1:6379>
setbit sign 5 0
(integer) 0
127.0.0.1:6379>
setbit sign 6 1
(integer) 0
查看某一天是否有打卡!
127.0.0.1:6379>
getbit sign 3
(integer) 1
127.0.0.1:6379>
getbit sign 5
(integer) 0
统计操作,统计 打卡的天数!
127.0.0.1:6379>
bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3
2.3 geospatial (地理位置)2.3.1 geoadd
127.0.0.1:6379>
geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
(integer) 3
127.0.0.1:6379>
geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
- 规则
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379>
geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
2.3.2 geopos
127.0.0.1:6379>
geopos china:city taiyuan manjing
1) 1) "112.54999905824661255"
1) "37.86000073876942196"
2) 1) "118.75999957323074341"
1) "32.03999960287850968"
获得当前定位, 一定是一个坐标值!
2.3.3 geodist
- 单位如下
- m
- km
- mi 英里
- ft 英尺
127.0.0.1:6379>
geodist china:city taiyuan shenyang m
"1026439.1070"
127.0.0.1:6379>
geodist china:city taiyuan shenyang km
"1026.4391"
2.3.4 georadius获得指定数量的人
127.0.0.1:6379>
georadius china:city 110 30 1000 km以 100,30 这个坐标为中心, 寻找半径为1000km的城市
1) "xian"
2) "hangzhou"
3) "manjing"
4) "taiyuan"
127.0.0.1:6379>
georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6379>
georadius china:city 110 30 500 km withdist
1) 1) "xian"
2) "483.8340"
127.0.0.1:6379>
georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
2) 1) "manjing"
2) "864.9816"
3) 1) "118.75999957323074341"
2) "32.03999960287850968"
参数 key 经度 纬度 半径 单位 [显示结果的经度和纬度] [显示结果的距离] [显示的结果的数量]
2.3.5 georadiusbymember
127.0.0.1:6379>
georadiusbymember china:city taiyuan 1000 km
1) "manjing"
2) "taiyuan"
3) "xian"
127.0.0.1:6379>
georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
1) 1) "taiyuan"
2) "0.0000"
3) 1) "112.54999905824661255"
2) "37.86000073876942196"
2) 1) "xian"
2) "514.2264"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
参数与 georadius 一样
2.3.6 geohash(较少使用)
127.0.0.1:6379>
geohash china:city taiyuan shenyang
1) "ww8p3hhqmp0"
2) "wxrvb9qyxk0"
将二维的经纬度转换为一维的字符串, 如果两个字符串越接近, 则距离越近
2.3.7 底层
127.0.0.1:6379>
type china:city
zset
【Redis数据类型大全(“5种基础”数据类型+“3种特殊”数据类型)】查看全部元素 删除指定的元素
127.0.0.1:6379>
zrange china:city 0 -1 withscores
1) "xian"
2) "4040115445396757"
3) "hangzhou"
4) "4054133997236782"
5) "manjing"
6) "4066006694128997"
7) "taiyuan"
8) "4068216047500484"
9) "shenyang"
1)"4072519231994779"
2)"shengzhen"
3)"4154606886655324"
127.0.0.1:6379>
zrem china:city manjing
(integer) 1
127.0.0.1:6379>
zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "taiyuan"
4) "shenyang"
5) "shengzhen"
推荐阅读
- 云原生时代,你真的懂Docker和LXC的区别吗()
- 求你了,别再说数据库锁的只是索引了!!!
- ansible部署kbuernetes
- 如何用WordPress本机图像工具替换TimThumb()
- 如何删除WordPress网站上的水平滚动条()
- 如何将WordPress类别选择限制为一个()
- 如何获得任何WordPress网站的所有插件的名称和活动主题()
- 如何在WordPress上获取帖子列表(仅标题,日期和时间)
- 如何让我的wordpress具有响应文本