Redis实战场景
Tip:Redis的数据类型模型
一.String实战场景
1. 对象缓存
- 使用set 存一个对象的值,不如把他拆分开来比如: KEY->user:1(id):name(字段) Value->kaikai 这样我们取出值比较方便且不用json序列化回去.
2. 分布式锁
简单的分布式锁实现
由于之前写过一点分布式锁的用法,这里简单提一下,想要了解的可以点下方链接
之前写过的分布式锁链接
3. 计数器
- 比如文章的阅读数量等等 例如用 incr article:readcount:1002来实现文章的计数器
- 用get article:readcount:{文章id}获取文章的阅读数
4.分布式系统全局序列号
由于Redis是单线程的,如果用每增加一个序列号就incr一下,等到并发量一旦大起来可能就会出错,比如我们现在有三个web应用,我们可以一次分配1000个序列给它,让它慢慢来用,等到用完后继续给他1000个,这样就比一条一条给性能好得多,拿给1000个就比如计数器记了1000个就用到了 INCRBY orderId 1000 这条命令
二.Hash实战场景
Tip: Hash基本命令
1. 对象缓存
- 对象缓存除了用String,也可以用Hash
- 批量设置: hmset user 1:name kaikai 1:balance 1888 1:phone 111111111
- 批量取值: hmget user 1:name 1:balance
存进去的值
2.电商购物车
- 加入购物车实现: 以 hset cart:{用户ID} {商品ID} 数量 ,为格式设置进去
- 购物车单个商品数量实现: hincrby cart:{用户ID} {商品ID} 数量 ,可以设置数量的增加.
- 购物车总数量实现: hlen cart:{用户ID},获取总的数量,返回相同filed的总数量
- 购物车商品删除实现: hdel cart:{用户ID},删除某个key的值
- 获取到购物车中所有商品的ID: hkeys cart:{用户ID}
三.List结构
Tip:List基本命令
1.实现数据结构
- 栈,先进后出,redis实现栈只需从同一边PUSH+POP命令即可
- 队列,先进先出,调用LPUSH+RPOP或RPUSH+LPOP可实现队列
2.阻塞队列
客户端实现监听模式,只要有值进队,立马拿到这个值
3.消息流
- 实现公众号发消息给关注他的人: 加入消息ID为1001,只要公众号发消息后,立马后台开启一个定时任务,一直给关注他的人的队列里面放这个消息ID,例如LPUSH msg:{用户ID} {消息ID},这样信息就直接加到用户list里面
- 页面获取消息,当我们一打开页面肯定是一些消息按时间顺序推送给我们的,那么最新的肯定是队列开头的值,这里用到了LRANG msg:{用户ID} 0 {要取到的消息下标},比如取5条就是 0 5,
四.Set集合
Tip: Set基本命令
1.抽奖
- 实现参与抽奖功能: SADD activity:{活动ID} {参与用户ID}
- 获取所有的参与人, 就是查看当前集合key的集合元素有哪些: SMEMBERS activity:{活动ID}
- 实现开奖,从集合中抽几个人中奖(不删除): SRANDMEMBER activity:{活动ID} 中奖人数
- 实现开奖,从集合中抽几个人中奖(删除),比如要抽123等奖,一等奖就不能抽二等奖需要删除: SPOP activity:{活动ID} 中奖人数
2.点赞收藏标签实现
3.集合操作
实现集合中的并,交,差集运算