redis核心数据结构
2023-07-03 12:09:25 13 举报
AI智能生成
redis的核心数据结构解析以及使用场景
作者其他创作
大纲/内容
String
单值缓存
SET key value
GET key
对象缓存
SET user:1 value(json数据格式)
MSET user:1:name zqh user:1:age 30
优点:适用频繁修改用户某个属性
MGET user:1:name user:1:age
分布式锁
SETNX product:10001 true
第一次返回1表示获取锁成功
SETNX product:10001 true
再次获取锁则失败,返回0
DEL product:10001
释放锁
SET product:10001 true ex 10 nx
设置超时时间,防止死锁
计数器
INCR new:readCount:{新闻id}
用来记录首页新闻的浏览量
GET new:readCount:{新闻id}
Web集群session共享
spring session+redis实现session共享
分布式系统全局序列号
INCRBY orderId 1000
可以批量生成序列号提升性能
Hash
对象缓存
HMSET user {userId}:name xxx {userId}:age xxx
缓存用户信息
示例:HMSET user 1:name zqh 1:age 30
id为1的用户,name为zqh,age为30
HMGET user 1:name 1:age
获取userId为1的用户信息
电商购物车
设计:以用户的id为key ,商品的id为field,商品的数量为value
HSET cart:1001 10088 1
用户id为1001的用户在购物车中添加了商品id为10088的产品
HINCRBY cart:1001 10088 1
用户1001增加了购物车中商品10088的数量
HLEN cart:1001
用户1001购物车中的商品数量
HDEL cart:1001 10088
用户1001删除了购物车中的商品10088
HGETALL cart:1001
获取用户1001购物车中所有商品
优点
同类数据归类整合存储,方便数据管理
相比string操作消耗cpu和内存更小
相比string存储更节省空间
缺点
过期功能不能用在field上,只能用在key上
redis集群架构下不适合大规模使用
根据key进行hash分配不平均
List
实现常用数据结构
Stack(栈) = LPUSH +LPOP
后进先出,从左边进,从左边取
Queue(队列) = LPUSH + LPOP
先进先出,从左边进,从右边出
Blocking MQ(阻塞队列) = LPUSH + BRPOP
微博和微信公众号消息流
场景:我在公众号关注了MacTalk,备胎说车等
LPUSH msg:{我的id} 10001
MacTalk发文章,消息ID为10001,往我的消息队列推送
备胎说车发文章,消息ID为10002,往我的消息队列推送
LPUSH msg:{我的id} 10002
LRANGE msg:{我的id} 0 4
查看我收到最新的5条订阅号消息
业务优化:
粉丝太多的大V,可以先给在线的用户发
pull模式,大V只发一份,上线的用户去pull消息
Set
微信抽奖小程序
SADD 1002 {userId}
点击参与id为1002的抽奖
SMEMBERS 1002
查看参与1002抽奖的所有用户
SRANDMEMBER KEY [count]/SPOP key [count]
抽取{count}名中奖者
SRANDMEMBER key count命令,不会删除Set中元素,适合一次性抽奖
SPOP key count 命令是抽取出,会删除Set中元素,适合多次抽奖,一等奖,二等奖,三等奖
微博点赞,收藏
SADD like:{消息id} {用户id}
表示一个微博所有的点赞用户
SREM like:{消息id} {用户id}
用户取消点赞
SISMEMBER like:{消息id} {用户id}
判断用户是否点赞
SMEMBER like:{消息id}
获取所有点赞该消息的用户信息
SCARD like:{消息id}
获取点赞用户数
集合操作
SINTER set1 set2
取交集
SUNION set1 set2
取并集
SDIFF set1 set2 set3
取差集,按照第一个集合为基准,第一个集合减去后面集合的并集,返回剩余的元素
微博微信关注模型
业务场景
101Set ->{102,103}
101关注了102和103
104Set->{101, 105, 102, 103}
104关注了101,105,102,103
102Set->{101, 104, 105, 103, 106}
102关注了101,104, 105, 103, 106
SINTER 101Set 104Set
取101和104的交集可以得到101和104 的共同关注{102,103}
SMEMBER 102Set
获取102关注的所有人,得到我关注的人也关注他
SDIFF 104Set 101Set
去两个集合的差集{105},获取101可能认识的人
电商筛选功能实现
业务场景:在电商平台根据品牌,操作系统,CPU,分辨率,内存等属性筛选想要的手机
SADD brand:huawei P40,SADD brand:huawei Mate40
设置华为品牌的手机集合为P40,Mate40
SADD brand:xiaomi mi10
设置小米品牌的手机集合为mi10
SADD brand:iPhone iphone14,SADD brand:iPhone iphone14 pro
设置苹果的手机集合为14,14pro
SADD os:android P40,SADD os:android Mate40,SADD os:android mi10
设置操作系统为安卓的手机集合为P40,Mate40,mi10
SADD cpu:brand:intel P40,SADD cpu:brand:intel Mate40,SADD cpu:brand:intel mi10
设置cpu品牌为intel的手机集合为P40,Mate40,mi10
SADD ram:8G P40,SADD ram:8G mi10,SADD ram:8G iphone14,SADD ram:8G iphone14pro
设置内存大小为8G的手机集合为p4,mi10,iphone14,iphone14pro
SINTER os:android cpu:brand:intel ram:8G ->{P40,Mate40,mi10}
取交集可以实现筛选操作系统为安卓,cpu品牌为intel,内存大小为8G的手机
Zset
实现热搜排行榜功能
ZINCRBY hotNews:20190819 1 守护香港
每当有用户点击守护香港这条热搜,score+1
ZREVRANGE hotNews:20190819 0 9 WITHSCORES
获取当日的热搜前十
ZUNIONSTORE hotNews:20190813-19 7 hotNews:20190813 ... hotNews:20190819
计算一周的热搜
ZREVRANGE hotNews:20190813-19 0 9 WITHSCORES
获取一周热搜前十
0 条评论
下一页