redis 常见问题
一:缓存击穿
大并发集中对这一个热点key进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
解决:
- 1、互斥锁
- 2、热点数据永远不过期
二:缓存雪崩
Redis中大批量key在同一时间同时失效导致所有请求都打到了MySQL。而MySQL扛不住导致大面积崩塌。
解决:
- 1、加锁
- 2、定时预更新
- 3、ttl加随机数
- 4、永不过期
三、缓存击穿
缓存穿透 是 指缓存和数据库中都没有的数据,数据那么就会导致数据库压力过大,严重会击垮数据库。
解决:
- 1、 鉴权校验,参数做校验等
- 2、IP限流
- 3、缓存空值
- 4、Bloom Filter
四:双写一致性
双写:缓存跟数据库均更新数据,如何保证数据一致性?
- 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
- 命中:应用程序从cache中取数据,取到后返回。
- 更新:先把数据存到数据库中,成功后,再让缓存失效。
五:脑裂
由于网络原因,导致master节点、slave节点 和 sentinel集群处于不用的网络分区,此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点 此时存在两个不同的master节点就像一个大脑分裂成了两个。
Redis处理方案是配置文件中 两个参数
min-replicas-to-write 3 表示连接到master的最少slave数量
min-replicas-max-lag 10 表示slave连接到master的最大延迟时间
配置了这两个参数后如果发生了集群脑裂则原先的master节点接收到客户端的写入请求会拒绝就可以减少数据同步之后的数据丢失。