目录
Sting存储
- Key设计注意事项
- 一般以业务功能模块、表名或者业务模块开头,尽量短小精悍
- 常见引用场景
- 计数功能:文章点击数
- 各类场景下的标识号 incrby serialNo 1000:订单号
- 每次生成订单会去redis请求生成订单号,但是redis上限是10W/s请求量,如果高并发下会耗尽redis资源无法进行其它操作,解决方案是一次请求预先分配多个订单号缓存到tomcat,下次请求会优先用缓存中的订单号
- 集群环境下的Session共享
- 两次请求到不同tomcat,只有第一次tomcat有session,解决方案是把session会话存储到redis,下次登录会验证redis中session是否过期
- 计数功能:文章点击数
实现分布式锁
- redis分布式锁基础知识
- 利用SETNX key value,key不存在返回true,如果key存在返回false实现
- 给定key设置的生存时间,当key过期时,它会被自动删除
- 用lua脚本原子性操作redis主动删除加锁值
- redis加锁正确姿势
- 加锁:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功SET key value NX PX 15000
- 失效时间避免死锁
- 加锁时,每个节点产生一个随机字符串,避免锁误删除
- 写入随机值与设置失效时间必须同时,保证加锁时原子性
- 加锁:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功SET key value NX PX 15000
- 解锁:匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的
Hash数据场景
- 淘宝购物车
- 全选功能-获取所有该用户的所有购物车商品:hgetall gouwuche:001
- 商品数量-购物车图标上要显示购物车里商品的总数:hget gouwuche:001 prod:001
- 删除-要能移除购物车里某个商品:hdel gouwuche:001 prod:001
- 增加或减少某个商品的数量:hincrby gouwuche:001 prod:001 5
List数据场景
- 阻塞队列:比如brpop,只有当redis没数据时候才会阻塞,有数据时候不会阻塞
- 订阅号消息:多个订阅号在不同时间发布消息通过下图展示,key为用户ID
Set集合数据场景
- 抽奖系统:key为活动ID
- 朋友圈点赞:key为朋友圈消息ID
- 如果用Set设计无法排序
- 可以用zset集合来设计
Set集合特殊指令应用场景
- 交集并集差集
- setA={A,B,C} setB={B, C}
- 集合与集合之间的交集:sinter setA setB-->得到集合{B,C}
- 集合与集合之间的并集:sunion setA setB -->得到集合{A,B,C}
- 集合与集合之间的差集:sdiff setA setB-->得到集合{A}
- setA={A,B,C} setB={B, C}
- 设计微博维关系设计
- James老师关注的人:sadd jamesCares lison peter king av
- Lison老师关注的人:sadd lisonCares james av cjk king
- av老师关注的人:sadd avCares deer cjk king
- James和lison共同关注的人:sinter jamesCares lisonCares,计算结果为 {av, king}
- 我关注的人也关注他(king老师)
- sismember lisonCares king
- sismember avCares king
- 我可能认识的人:SDIFF lisonCares jamesCares-> {james.cjk}
- 新闻热搜:key为日期,会出现值越来越大,可以适当分小时等分段操作
- 点击话题:zincrby topic:20201111 1 文章名称
- 实现前8排行榜:zrevrange topic:20201111 0 8 withscores
- 统计近3日点击数据:zunionstore topic:3day 3 topic:20201113 topic:20201112 topic:20201111
- 展示近3日的排行前8名:zrevrange topic:20201113-20201111 0 8 withscores