Redis优化、设计
2021-06-05 17:56:27 1 举报
AI智能生成
Redis优化、设计
作者其他创作
大纲/内容
1、<b><font color="#f15a23">三种场景</font></b>
缓存穿透
概念
查询到一个根本不在的key,大量的查询将落到数据库。
解决方案
1、<b><font color="#c41230">缓存空对象</font></b>,不管数据库有没有值,都缓存。<br>
2、<b><font color="#c41230">布隆过滤器</font></b>
缓存击穿
概念
大批量缓存在同一时间失效可能导致大量请求同时穿透缓存直达数据库。
解决方案
设置缓存的<b><font color="#c41230">随机失效时间</font></b>。<br>
缓存雪崩
概念
缓存层支撑不住或宕掉后, 流量会像奔逃的野牛一样, 打向后端存储层。
解决方案
1、保证缓存层服务高可用性,比如使用<b><font color="#c41230">Redis Sentinel或Redis Cluster</font></b>。
2、依赖隔离组件为后端限流熔断并降级。比如使用<font color="#c41230">Sentinel或Hystrix限流降级组件</font>。(非关键信息直接返回空值)<br>
3、提前演练。
2、热点缓存重建优化
概念<br>
开发人员使用“缓存+过期时间”的策略既可以加速数据读写, 又保证数据的定期更新;当缓存失效时,并有大量并发重建索引,如果重建索引缓慢就会对应用造成致命的危害
解决方案<br>
1、<font color="#f15a23">分布式锁</font>(保证只有一个线程重建索引)
2、其他没有获取锁的线程,<font color="#f15a23">休眠50ms</font>,重新获取。<br>
3、<font color="#c41230">缓存双写不一致</font>
概念
高并发场景,多个线程,更新或删除缓存导致缓存和实际数据库值不一样。
解决方案
1、通过加<font color="#c41230"><b>读写锁</b></font>保证并发读写或写写的时候按顺序排好队,读读的时候相 当于无锁。
2、阿里开源的<font color="#c41230"><b>canal</b></font>通过监听数据库的binlog日志及时的去修改缓存
3、<b><font color="#c41230">延迟双删</font></b>:sleep(50ms),再进行删除。
4、避免bigkey
概念:缓存的value过大,导致取value过慢,造成阻塞。
解决方案
1、尽量避免
2·、拆分,分段存储
3、能用hash,避免使用多个string
4、可以遍历时,使用hscan、sscan、zscan代替<br>
5、多个操作同时执行
<font color="#f15a23">管道</font>
一次执行多个命令,但不保证原子性。
<font color="#f15a23">lua脚本</font>
将多个命令变为一个命令,保证原子性。
6、缓存删除
策略
针对设置了过期时间的key做处理
1. volatile-ttl:越早越先删
2. volatile-random:随机删
3、volatile-lru
4: volatile-lfu
针对所有的key做处理
1:allkeys-random:随机删
2:allkeys-lru
3:allkeys-lfu
不处理
满了,就OOM
算法
LRU 算法:淘汰很久没被访问过的数据,以<font color="#c41230">最近一次访问</font>时间作为参考。<br>
LFU 算法:淘汰最近一段时间被访问次数最少的数据,以<b><font color="#c41230">次数</font></b>作为参考。(<font color="#c41230">高并发推荐</font>)
0 条评论
下一页