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