缓存雪崩
- redis挂掉
- 缓存同时过期失效
解决方案:
(1)事发前:实现Redis的高可用(主从架构+Sentinel(哨兵) 或者Redis Cluster(集群))
事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据
(2)redis key过期时间不要相同(快速恢复)
缓存穿透
缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。
- 缓存中没有,数据库中也没有
解决方法:
(1)布隆过滤器
(2)数据库中查不到在redis中设置空值,设置很短过期时间(一般不超过5分钟)
缓存击穿
某个key在某个时间点被超高并发访问,“热点”数据
- 缓存中没有,数据库有
解决方法:分布式锁 -> 保证只有一个线程访问数据库
redis 数据过期策略
缓存与数据库数据一致性
redis 持久化策略 RDB