这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
Redis
概述
为什么需要Redis
- mysql数据量增加
- 读写压力不断增大
数据分冷热数据
- 冷数据:不则么访问
- 热数据:经常访问
要将热数据存储到内存中
Redis基本工作原理
redis是单线程处理所有操作命令,比如命令1比命令2先到达,那么命令1就会比命令2先执行
Redis应用案例
签到
String数据结构
消息通知
List数据结构
listpack实际就是将多个数据压缩到一个节点上
计数
用redis可以提高性能,承受更多的访问量
当需要增加点赞数时,可以用redis的
hincrby指定某个字段进行增加
Hash数据结构dict
排行榜
积分变化时,排名要实时变更
可以使用zset实现
ZINCRBY myzset 2 AlexZSCORE myzset "Alex":倒排序
zset数据结构
zset实际上是跳跃表+hash的数据结构
因为有tail和backword因此可以方便实现按分值倒排
限流
这是限制每秒系统总体请求数,就是用当前时间的秒值做为key,在这1秒钟内,每来一个请求key的值就+1,当值超过阈值后,就阻断请求
分布式锁
sexnx无法保证高可用的分布式锁,
- 可能出现业务执行超时而自动解锁,导致并发问题。业务执行时间超过锁超时时间
- redis主备切换临界点问题。主备切换后,A持有的锁还未同步到新的主节点时,B可在新主节点获取锁,导致并发问题。
- redis集群脑裂,导致出现多个主节点
Redis使用注意事项
大Key
定义
大Key的危害
- 读取成本高
- 容易导致慢查询(过期、删除)
- 主从复制异常,服务阻塞
- 无法正常响应请求
业务侧使用大Key的表现
- 请求Redis超时报错
因为redis是单线程执行,因此如果一个key很大导致读写时间很长,就会阻塞后面命令的执行
消除大key方法
拆分时,先在第一个分key的值上写入被拆成了几个key-value
热key
定义
解决热key方法
- 设置localcache
-
拆分
-
使用redis代理的热key承载能力
本质就是多了一层中间层,将原本客户端需要做的,让中间层做了
慢查询场景
缓存穿透,缓存雪崩
如何减少缓存穿透
- 缓存空值:如一个不存在的userlD。这个id在缓存和数据库中都不存在。则可以缓存一个空值,下次再查缓存直接反空值。
- 布隆过滤器:通过bloom filter算法来存储合法Key,得益于该算法超高的压缩率,只需占用极小的空间就能存储大量key值
如何避免缓存雪崩
- 缓存空值:将缓存失效时间分散开,比如在原有的失效时间基础上增加一个随机值,例如不同Key过期时间,可以设置为10分1秒过期,10分23秒过期,10分8秒过期。单位秒部分就是随机时间,这样过期时间就分散了。
- 对于热点数据,过期时间尽量设置得长一些,冷门的数据可以相对设置过期时间短一些。
- 使用缓存集群,避免单机宕机造成的缓存雪崩。