Redis常用数据结构及应用场景的吐血整理
1. String数据类型:
字符串常用操作:
-
SET key value
存入键值对, SET覆写旧值,无视类型 -
MSET key value [key value ...]
批量存储字符串键值对 -
SETNX key value
存入一个不存在的键值对,若key存在,不做任何操作 -
GET key
根据key获取key对应的value值 -
MGET key [key ...]
批量获取字符串键值对 -
DEL key
删除对应key的键值对 -
EXPIRE key seconds
给给定key值设置有效时间
原子加减
-
INCR key
给key值对应的数字加1 -
DECR key
给key存储的数值减1 -
INCRBY key increment
给key存储的数组加上increment -
DECRBY key increment
给key存储的数组减去increment
应用场景:
-
单值缓存:
SET key value
,GET key
-
对象缓存:
SET user:1 value(json字符串)
;
存:MSET user:1:name zhangsan user:1:age 10
取:MGET user:1:name user:1:age
比json格式好,方便单属性操作,性能更好一点,最优选择HASH
-
分布式锁:
SETNX product:10001 true
// 发返回1表示加锁成功,有弊端不要使用
SETNX product:10001 true
// 发返回0表示加锁失败
DEL product:10001
// 释放锁
SET product:10001 true ex 10 nx
// 防止程序意外终止导致死锁 -
计数器
微信公众号阅读量使用场景
阅读量统计在Redis中的使用:
-
INCR article:readcount:{文章Id}
文章的阅读量统计 GET article:readcount:{文章Id}
-
-
分布式系统唯一id生成
INCRBY orderId 1000
redis生成序列号,提升性能。
2.HASH结构
常用操作
-
HSET key field value
// 存储一个哈希表key的键值 -
HSETNX key field value
// 存储一个不存在的hash表的key的键值 -
HMSET key field value [field value ...]
在一个哈希表key中存储多个键值对 -
HGET key field
获取一个哈希表中field的键值 -
HMGET key field [field ...]
获取哈希表key中多个field的键值 -
HDEL key field [field ...]
删除哈希表key中field键值 -
HLEN key
哈希表key中field的数量 -
HGETALL key
返回哈希表key中所有键值对 -
HINCRBY key field increment
为哈希表key中field字段的值加上增量 increment
应用场景
-
对象存储
HSET user:10001 name zhangsan age 10
// 设置对象属性
HGET user:10001 name age
// 获取属性信息 -
电商购物车场景
购物车场景
电商购物车数据结构:
- 以用户ID为key
- 商品ID为field
- 商品数量为value
购物车操作:
- 添加商品->
HSET cart:1001 10088 1
- 增加数量->
HINCRBY cart:1001 10088 1
- 商品总数->
HLEN cart:1001
- 删除商品
HDEL cart:1001 10088
- 获取购物车所有商品->
HGETALL cart:1001
3.List数据结构
List结构示意图常用命令
-
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指定 -
BLPOP key [key ...] timeout
从key表头弹出一个元素,若该key没有元素则堵塞等待,堵塞timeout,若timeout为0表示一直堵塞 -
BRPOP key [key ...] timeout
从key表尾弹出一个元素,若该key没有元素则阻塞等待,堵塞timeout,若timeout为0表示一直堵塞
应用场景
-
常用数据结构
- Stack(栈)=LPUSH+LPOP->FILO 先进后出
- Queue(队列)= LPUSH+RPOP->FIFO 先进先出
- Blocking MQ(堵塞队列)= LPUSH+BRPOP
-
微博和微信公众号消息流
示例中关注微信公众号备胎说车和Mac Talk在Redis中的使用:
- Mac Talk 发布消息ID为10018->
LPUSH msg:{订阅人Id} 10018
- 备胎说车发布消息ID为10019->
LPUSH msg:{订阅人Id} 10019
- 查看最新订阅的消息,比如6条->
LRANGE msg:{订阅人Id} 0 5
4.SET结构
常用命令
-
SADD key member [member ...]
将一个或者多个member放入key中,元素存在则忽略 -
SREM key member [member ...]
移除集合key中的一个或者多个member -
SMEMBERS key
返回集合key中所有元素 -
SCARD key
集合key中元素个数 -
SISMEMBER key member
判定member是否为key中的元素 -
SRANDMEMBER key [count]
从key中随机取出count个元素,元素不从key中删除 -
SPOP key [count]
从key中随机取出count个元素,元素从key中删除 -
SINTER key [key ...]
交集运算 -
SINTERSTORE destination key [key ...]
将交集结果存在新集合destination中 -
SUNION key [key ...]
并集运算 -
SUNIONSTORE destination key [key ...]
将并集结果存在新集合destination中
-SDIFF key [key ...]
差集运算,
应用场景
-
抽奖模型
抽奖模型
示例中参与抽奖在Redis中的使用:
- 点击参与抽奖加入集合->
SADD key {userId}
- 查看抽奖参与的所有用户->
SMEMBERS key
- 抽取count名中奖者->
SRANDMEMBER key [count]/SPOP key [count]
- 点击参与抽奖加入集合->
- 微博微信点赞、关注、收藏等
示例中点赞模型在Redis中的使用:
-
点赞->
SADD like:{消息id} {用户id}
-
取消点赞->
SREM like:{消息id} {用户id}
-
检查用户是否点赞->
SISMEMBER like:{消息id} {用户id}
-
获取点赞的用户列表->
SMEMBERS like:{消息id}
-
获取点赞用户数->
SCARD like:{消息id}
-
微信微博关注模型:
微信关注模型
示例微信关注模型在Redis中的使用:
- 张三关注的人->
zhangsanSET->{lisi,sima,luban}
- 李四关注的人->
lisiSET->{zhangsan,sima,luban,qiaofeng}
- 王五关注的人->
wangwuSET->{zhangsan,lisi,luban,qiaofeng,duanyu}
- 张三和李四共同关注的人->
SINTER zhangdanSET lisiSET
- 张三关注的人也关注了李四->zhangsanSET列表每个成员关注列表去判定
SISMEMBER simaSET lisi
,SISMEMBER lubanSET lisi
- 张三可能认识的人->
SDIFF lisiSET zhangsanSET
- 张三关注的人->
-
集合操作电商平台商品筛选:
商品筛选
商品筛选条件在redis中的使用:
SADD brand:HUAWEI p30
SADD brand:xiaomi mi-6X
SADD brand:IPhone iphone8
SADD os:android p30 mi-6X
SADD cpu:brand:intel p30 mi-6X
SADD ram:8G p30 mi-6X iphone8
-
SINTER os:android cpu:brand:intel ram:8G
->{p30 mi-6X}
SortedSet数据结构
常用命令
-
ZADD key score member [[score member] [score member] ...]
向有序结合key添加带分值的元素 -
ZREM key member [member ...]
从有序集合中删除key -
ZSCORE key member
返回有序key中member成员的 score值 -
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下标的元素 -
ZUNIONSTORE destination numkeys key [key ...]
并集计算 -
ZUNIONSTORE destination numkeys key [key ...]
交集计算
应用场景
-
排行榜场景
排行榜
微博排行榜在Redis中的使用:
- 点击新闻->
ZINCRBY hotNews:20190819 1 守护香港
- 展示当日排行前十->
ZREVRANGE hotNews:20190819 0 10 WITHSCORES
- 七日搜索榜单->
ZUNIONSTORE hotNews:20190813-20190819 7 hotNews:20190813 hotNews:20190814 hotNews:20190815....hotNews:20190819
- 展示7日排行前十->
ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES
- 点击新闻->