为什么要使用缓存
典型场景
- 读多写少的场景
memorycache 单台机器 QPS能达到 50000
- 需要复杂计算后得出数据,存储系统无能为力
如计算论坛实时在线人数
使用缓存常见的问题和解法
缓存击穿
- 读取不存在的key
key不存在,当高并发请求,所有请求均打到DB
解法:不存在的key,存放一个空值
- 缓存的生成耗时较长
典型场景:商品分页数据,后面的页数访问较少,缓存容易失效。此时高并发的请求均打到DB
解法:并没有比较好的解法,做好监控
缓存雪崩
雪崩指 缓存失效后 引起系统性能急剧下降的情况
但缓存失效后,对于业务量较大的系统,大量的高并发请求到缓存,任意一个线程同时去请求到DB(都不知道其他线程已经有在请求DB,并更新缓存),导致DB压力较大,一连串反应,影响系统稳定性
解法:
- 更新锁
采用分布式锁,保障只有一个线程去请求到DB并更新缓存。
分布式锁的实现方式要研究一下 https://www.cnblogs.com/austinspark-jessylu/p/8043726.html
- 后台定时更新
所有请求都不达到DB,而是通过定时任务定时更新缓存,防止失效。
- 问题:定时任务更新不及时导致数据不一致怎么办?
对于需要即时数据一致的情况,可以在数据更新后 消息通知触发定时任务运行;
其他解法:
双key策略:要缓存的key的过期时间为t,key1没有过期时间,当缓存读取不到key的内容时就返回key1的内容,然后触发一个事件同时更新key和key1
缓存穿透和雪崩什么区别
我的理解:
穿透是表述了现象:缓存没生效,达到了DB;雪崩更强调结果,导致系统一连串稳定性问题;
穿透可能会导致雪崩
缓存热点
对单个key 的访问过大,导致单机问题;
解法:
- 冗余存储,分散查询。比如缓存key为key1,冗余存储多份数据 key1, key2, key3,存储value相同;上层查询策略上采用随机路由查询;