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