Redis-常用场景
一、缓存
热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据
二、数据共享分布式
分布式Session,如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取
三、分布式锁
几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到对同一个资的并发访问的技术难题,如秒杀、下单减库存等场景。
用synchronize或者reentrantlock本地锁肯定是不行的。
如果是并发量不大话,使用数据库的悲观锁、乐观锁来实现没啥问题。
但是在并发量高的场合中,利用数据库锁来控制资源的并发访问,会影响数据库的性能。
实际上,可以用Redis的setnx来实现分布式的锁
四、全局ID
incrby,利用原子性,分库分表的场景,一次性拿一段
五、计数器
文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库
六、用户消息时间线timeline
双向链表,直接作为timeline就好了。插入有序
七、抽奖
spop myset自带一个随机获得值
八、点赞,签到,打卡
微博ID是t1001,用户ID是u3001用 like:t1001 来维护 t1001 这条微博的所有点赞用户点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001 u3001
点赞的所有用户:smembers like:t1001点赞数:scard like:t1001
九、限流
以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false
十、位统计
例如:在线用户统计,留存用户统计setbit onlineusers 01 setbit onlineusers 11 setbit onlineusers 20
十一、购物车
key:用户id;field:商品id;value:商品数量。+1:hincr。-1:hdecr。删除:hdel。全选:hgetall。商品数:hlen。
十二、消息队列
List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
十三、用户推荐,推荐模型
follow 关注 fans 粉丝相互关注:
sadd 1:follow 2 sadd 2:fans 1
sadd 1:fans 2 sadd 2:follow 1
我关注的人也关注了他(取交集):sinter 1:follow 2:fans
可能认识的人:
用户1可能认识的人(差集):sdiff 2:follow 1:follow
用户2可能认识的人:sdiff 1:follow 2:follow
十四、消息发布和订阅
Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比,主要用于业务解耦、流量削峰及异步处理实时性低的业务
十五、排行榜
比如,用户每天上传视频,获得点赞的排行榜可以这样设计:
1.用户Jay上传一个视频,获得6个赞,可以酱紫:zadd user:ranking:2021-03-03 Jay 3
2.过了一段时间,再获得一个赞,可以这样:zincrby user:ranking:2021-03-03 Jay 1
3.如果某个用户John作弊,需要删除该用户:zrem user:ranking:2021-03-03 John
4.展示获取赞数最多的3个用户zrevrangebyrank user:ranking:2021-03-03 0 2
十六、商品筛选
获取差集sdiff set1 set2
获取交集(intersection )sinter set1 set2
获取并集sunion set1 set2
十七、商品标签
sadd tags:i5001 画面清晰细腻
sadd tags:i5001 真彩清晰显示屏
sadd tags:i5001 流程至极
可能还有其他场景我不清楚的,如果有可以在评论区评论一下,向大家学习