Redis 场景设计应用
String存储
1.Key 的设计注意事项
一般以业务功能模块:
比如购物车key: cart:001,表示1号用户的购物车 简短,明了以主,节约内存
2.简单字符缓存
set key value
get key
3. 结构体或对象存储
a) set user value // value 为xml 或Json 格式
b) mset user:1:name deer user:1:age 18
c) mget user1:name user:1:age
String 常见应用场景
1. 计数功能(文章编号为001)
INCR article:001
GET article:001
2. 各类场景下(单机或分布式)的标识号
incrby serialNo 1000
3. 集群环境下的Session共享(类似于单点登录)
使用spring session与redis完成session共享
String 实现分布式锁
关于redis分布式锁的基础知识
1. 缓存有效期
redis中的数据,不一定都是持久化的;给定key设置的生存时间,当key过期时,它会被自动删除;
2. SETNX 命令
SETNX key value,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
3. lua 脚本
轻量小巧的脚本语言, 用于支持redis 操作序列的原子性。
Redis 加锁的正确姿势 ,来自于Redis 作者antirez 的总结归纳
1. 加锁
通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功;
注意点:
必须给锁设置一个失效时间 -> 避免死锁
加锁时,每个节点产生一个随机字符串 -> 避免锁误删
写入随机值与设置失效时间必须是同时的 -> 保证加锁是原子的
2. 解锁
匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的;
执行如下lua脚本:
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
HASH存储数据
对象级别存储的2种方式
1. hmset user:3 name james age 18
hmset user:4 name lison age 5
2. hmset user 3:name james 3:age 18 4:name lison 4:age 5
购物车
功能
1.全选功能-获取所有该用户的所有购物车商品
2.商品数量-购物车图标上要显示购物车里商品的总数
3.删除-要能移除购物车里某个商品
4.增加或减少某个商品的数量
userid: 001
如何设计实现?
hmset cart:001 prod:01 1 prod:02 1
指令说明:
当前登录用户ID号做为KEY,商品ID号为Field, 加入购物车数量为value,
List 场景- 数据结构
面试题目: 如何利用List实现栈、队列(请用JAVA代码实现)
常见List 场景
面试题:
老师的微信ID:004,他关注了CSDN, 男子别输在说话上,左图展示效果如何设计?
1) 比如:CSDN发布了一条消息ID为999
lpush mes:004 999
2)男子别输在说话上也发布了一条消息ID为1000
lpush mes:004 1000
3) 那么左图老师的微信消息列表实现如下
lrange mes:004 0 5
Set 应用场景
指令:sadd key member1 member2
微信有一个活动,活动ID为001,如何实现微信抽奖功能,基于Redis设计实现?
userId: 004
1)当Lison点击参与抽奖时,数据放入set集合
sadd act:001 004
2) 开始抽奖2名中奖者
srandmember act:001 2 或 spop act:001 2
2) 查看有多少用户参加了本次抽奖
smembers act:001
Set集合快速应用
面试题目:朋友圈消息ID:008,微信点赞如何设计?
张三用户ID 为userId:01
1)张三对消息ID008点赞啦
sadd zan:008 userId:01
2) 张三取消了对消息008的点赞
srem zan:008 userId:01
3)检查用户是否点过赞
sismember zan:008 userId:01
4)获取消息ID008所有的点赞用户列表
smembers zan:008
5)消息ID008的点赞数计算
scard zan:008
Set 集合特殊的操作指令
1)集合与集合之间的交集
sinter setA setB -> 得到集合 {B,C}
2) 集合与集合之间的并集
sunion setA setB -->得到集合{A,B,C}
3)集合与集合之间的差集
sdiff setA setB-->得到集合{A}
Set集合特殊的操作指令应用场景
如何实现微博的微关系设计?
条件1)James老师关注的人
sadd jamesCares lison,peter,king,av
条件2) Lison老师关注的人
sadd lisonCares james,av,cjk,king
条件3) av老师关注的人
sadd avCares deer,cjk,king
--------------
计算1)James和lison共同关注的人
sinter jamesCares lisonCares , 计算结果为 {av, king}
计算2) 我关注的人也关注他(king老师)
sismember lisonCares king
sismember avCares king
计算3)我可能认识的人
SDIFF lisonCares jamesCares-> {james.cjk}
Zset有序集合
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员
Zset 集合项目实战
腾讯新闻话题榜Redis设计实现, 以日期做为Key
1)点击话题
zincrby topic:20191022 1 军嫂怒怼张馨予
2) 右侧排行实现,展示今日前9排名
zrevrange topic:20191022 0 20 withscores
3)统计近3日点击数据
zunionstore topic:3day 3 topic:20191022 topic:20191021 topic:20191020
4) 展示近3日的排行前9名
zrevrange topic:20191022-20191020 0 9 withscores
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77114.html