缓存穿透
场景:用户查询数据库中没有的数据,这样不论如何都不会写入缓存,请求量一大对数据库也不是很友好
解决方法:
- 缓存无效Key
- 布隆过滤器
缓存雪崩
场景:并发量很大的情况下,大量数据同时过期,在那一瞬间,数据库压力暴增
解决方案:
- 在过期时间基础上添加随机数
- 设置数据永不过期,新开一个线程完成更新
缓存击穿
场景:某个访问量极大的数据,在过期瞬间,所有访问量打进数据库,给数据库造成极大压力
解决方案:
- 设置数据永不过期,新开一个线程完成更新
- 对大量的访问线程进行阻塞拦截,只放一个线程与数据库进行交互,并写入缓存中
缓存与数据库一致性问题
如何保证缓存与数据库的一致性?
- 先操作缓存,将缓存缓存特殊值,当用户查到特殊值时则进入休眠,但是对业务有入侵性;
- 延迟双删:先删缓存,再写数据库,再删缓存
- 先写数据库再删缓存
- 逻辑上设置过期时间,另开线程刷新缓存,删除逻辑上过期的key