这是我参与「第五届青训营」伴学笔记创作活动的第14天。青训营的第十七次课程中对Redis的相关知识进行了讲解,下面是我对本次课程内容的一些总结。
为什么要用Redis
- 随着业务量级上升,数据库读写压力越来越大;
- Redis可以将热数据存储在内存中,从而提高系统的吞吐量。
Redis基本原理
- 数据从内存中读写,从而具备较高的吞吐率;
- 所有操作均使用单线程进行排队执行;
- 数据保存到硬盘上,防止重启数据丢失;
Redis应用
-
连续签到:用户每日有一次签到的机会,如果断签,连续签到计数归零;使用过期时间字段,使得字段在后天的0点时过期;
-
消息通知:使用list作为消息队列,当需要发送消息时将消息发送到list。同时,使用监听器监听list,当消息插入到list即可感知到消息。
-
计数:一个用户有多项计数需求,可以通过hash结构存储;
-
排行榜:当积分变化时,排名要实时变更;使用
zset数据结构,其由跳表和哈希表所实现,哈希表存储了参与排名的键到排行榜权重的映射,并通过在跳表中查找对应的权重,从而知道具体的排名; -
限流:当请求到来时,对当前时间戳所组成的键进行递增,并当其超过一定值后禁止访问;
-
分布式锁:使用setnx实现,其运用了Redis是单线程执行命令的特性实现;
Redis注意事项
-
大Key:
- 大Key的危害:有读取成本高、容易造成慢查询、主从复制异常,阻塞服务
- 解决大Key方法:1.将大Key拆分为小Key;2.使用压缩算法对数据进行压缩;3.对于集合类数据结构,可以使用拆分key,或冷热分离(仅存储最常用的N个数据).
-
热Key
- 用户访问一个Key的频率很高,使得Server出现负载突增;
- 解决方案:1.使用本地缓存;2.将一份热Key复制写入多份;3.使用Redis代理
-
慢查询
- 传入数据单批次不要超过100个,使得性能下降;
- 避免使用大key
- zset过大时,会导致慢查询;
-
缓存穿透
- 热点数据查询绕过缓存,直接查询数据库
- 解决方案:1.使用布隆过滤器,检查对应key是否存在;2.在缓存中存储不存在键对应值为空值;
-
缓存雪崩
- 大量缓存同时过期
- 1.将缓存失效时间分散开;2.使用Redis集群;