Redis常见数据类型和使用场景
# Redis常见数据类型和使用场景
# 前言
主要介绍redis常见的五种基本数据类型string、hash、list、set、sorted set和三种特殊的数据类型bitmap、geo、hyperloglog的常用操作和应用场景。我们可以通过help @String
这种方式查看相应的文档。
如果你想了解更多命令,亦可参考官方文档:https://redis.io/docs/manual/data-types/data-types-tutorial/#strings (opens new window)
# 五种基本数据类型
# string
# 1、常见操作
字符串
SET key value //存入字符串键值对 GET key //获取一个字符串键值 MSET key value [key value ...] //批量存储字符串键值对 MGET key [key ...] //批量获取字符串键值 SETNX key value //存入一个不存在的字符串键值对 DEL key [key ...] //删除一个键 EXPIRE key seconds //设置一个键的过期时间(秒)
1
2
3
4
5
6
7原子加减
INCR key //将key中储存的数字值加1 DECR key //将key中储存的数字值减1 INCRBY key increment //将key所储存的值加上increment DECRBY key decrement //将key所储存的值减去decrement
1
2
3
4# 2、应用场景
单值存储
SET key value GET key
1
2对象缓存,存储用户信息实现session共享
1) SET user:1 value(json格式数据) 2) MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance
1
2
3分布式锁
SETNX product:10001 true //返回1代表获取锁成功,返回0代表获取锁失败 。。。执行业务操作 DEL product:10001 //执行完业务释放锁 SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
1
2
3
4计数器 文章的点击量、已读量等等,也可用作
分布式系统序列ID
INCR article:readcount:{文章id} GET article:readcount:{文章id} INCRBY orderId 1000 //redis批量生成序列号提升性能
1
2
3
4# hash
# 1、常见操作
HSET key field value #存储/获取一个哈希表key的键值 HGET key field HSETNX key field value #存储一个不存在的哈希表key的键值 HMSET key field value [field value ...] #批存储/获取哈希表key中多个field键值 HMGET key field [field ...] HDEL key field [field ...] #删除哈希表key中的field键值 HLEN key #返回哈希表key中field的数量 HGETALL key #返回哈希表key中所有的键值 HINCRBY key field increment #为哈希表key中field键的值加上增量increment
1
2
3
4
5
6
7
8
9# 2、应用场景
对象缓存
HMSET user {userId}:name zhuge {userId}:balance 1888 HMSET user 1:name zhuge 1:balance 1888 HMGET user 1:name 1:balance
1
2
3电商购物车
优点
1)同类数据归类整合储存,方便数据管理
2)相比string操作消耗内存与cpu更小
3)相比string储存更节省空间
缺点
1 过期功能不能使用在field上,只能用在key上
2 Redis集群架构下不适合大规模使用容易产生bigkey 注意拆分
# list
# 1、常见操作
LPUSH key value [value ...] #将一个或多个值value插入到key列表的表头(最左边) RPUSH key value [value ...] #将一个或多个值value插入到key列表的表尾(最右边) LPOP key #移除并返回key列表的头元素 RPOP key #移除并返回key列表的尾元素 LRANGE key start stop #返回列表key中指定区间内的元素,区间以偏移量start和stop指定 #从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 BLPOP key [key ...] timeout #从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout
1
2
3
4
5
6
7
8
9
10# 2、应用场景
数据结构
- Stack(栈) = LPUSH + LPOP
- Queue(分布式队列)= LPUSH + RPOP
- Blocking MQ(阻塞队列)= LPUSH + BRPOP
微博消息和公众号消息 场景:A关注了B,C等明星,订阅这些明星的微博或公众号消息
解决方案一:适合明星关注量较小的
1)B发微博,消息ID为10018 LPUSH msg:{A-ID} 10018 2)C发微博,消息ID为10086 LPUSH msg:{A-ID} 10086 3)查看最新微博消息 LRANGE msg:{A-ID} 0 4
解决方案二:在线发送,上线拉取LPULL
# set
# 1、常见操作
基本操作
SADD key member [member ...] #往集合key中存入元素,元素存在则忽略,若key不存在则新建 SREM key member [member ...] #从集合key中删除元素 SMEMBERS key #获取集合key中所有元素 SCARD key #获取集合key的元素个数 SISMEMBER key member #判断member元素是否存在于集合key中 SRANDMEMBER key [count] #从集合key中选出count个元素,元素不从key中删除 SPOP key [count] #从集合key中选出count个元素,元素从key中删除
1
2
3
4
5
6
7运算操作
SINTER key [key ...] //交集运算 SINTERSTORE destination key [key ..] //将交集结果存入新集合destination中 SUNION key [key ..] //并集运算 SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中 SDIFF key [key ...] //差集运算 SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
1
2
3
4
5
6# 2、应用场景
微信抽奖小程序
1)点击参与抽奖加入集合 SADD key {userlD} 2)查看参与抽奖所有用户 SMEMBERS key 3)抽取count名中奖者 SRANDMEMBER key [count] / SPOP key [count]
1
2
3
4
5
6微信微博点赞,收藏,标签
1) 点赞 SADD like:{消息ID} {用户ID} 2) 取消点赞 SREM like:{消息ID} {用户ID} 3) 检查用户是否点过赞 SISMEMBER like:{消息ID} {用户ID} 4) 获取点赞的用户列表 SMEMBERS like:{消息ID} 5) 获取点赞用户数 SCARD like:{消息ID}
1
2
3
4
5
6
7
8
9
10集合操作实现微博微信关注模型
1) 张三关注的人: zhangsanSet-> {wangwu, xushu} 2) 李四关注的人: lisiSet--> {zhangsan, zhaoliu, wangwu, sunqi} 3) 王五关注的人: wangwuSet-> {zhangsan, lisi, zhaoliu, sunqi, xunyu) 4) 张三和李四共同关注: SINTER zhangsanSet lisiSet--> {wangwu, sunqi} 5) 张三关注的人也关注他(李四): SISMEMBER wangwuSet lisi SISMEMBER sunqiSet lisi 6) 我可能认识的人: SDIFF lisiSet zhangsanSet->(zhangsan, zhaoliu}
1
2
3
4
5
6
7
8
9
10
11
12
13集合操作实现电商商品筛选
SADD brand:huawei P40 SADD brand:xiaomi mi-10 SADD brand:iPhone iphone12 SADD os:android P40 mi-10 SADD cpu:brand:intel P40 mi-10 SADD ram:8G P40 mi-10 iphone12 SINTER os:android cpu:brand:intel ram:8G {P40,mi-10}
1
2
3
4
5
6
7# sorted set
# 1、常见操作
基本操作
ZADD key score member [[score member]…] //往有序集合key中加入带分值元素 ZREM key member [member …] //从有序集合key中删除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCRBY key increment member //为有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素个数 ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素 ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
1
2
3
4
5
6
7集合操作
ZUNIONSTORE destkey numkeys key [key ...] //并集计算 ZINTERSTORE destkey numkeys key [key …] //交集计算
1
2# 2、应用场景
zset集合操作实现排行榜
1)点击新闻 ZINCRBY hotNews:20190819 1 守护香港 2)展示当日排行前十 ZREVRANGE hotNews:20190819 0 9 WITHSCORES 3)七日搜索榜单计算 ZUNIONSTORE hotNews:20190813-20190819 7 hotNews:20190813 hotNews:20190814... hotNews:20190819 4)展示七日排行前十 ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES
1
2
3
4
5
6
7
8
9
# 特殊数据类型
# bitmap
# hyperloglog
# geospatial
# 1、常见操作
geoadd:添加地理位置的坐标。 geopos:获取地理位置的坐标。 geodist:计算两个位置之间的距离。 georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。 geohash:返回一个或多个位置对象的 geohash 值。
1
2
3
4
5
6# 2、应用场景
附近的人、附近的商家、附近的车辆