缓存雪崩
现象
缓存服务全部崩溃(机器宕机等原因),数据请求全都落到数据库上,导致数据库也崩溃
解决方案
- 事前:保证redis高可用性,可采用主从+哨兵,redis cluster,避免全盘崩溃
- 事中:采用本地缓存(ehcache)和限流组件(hystrix)
- 事后: redis持久化机制,尽快恢复缓存集群,一旦重启,自动从磁盘上加载数据,恢复内存中的数据
缓存穿透
现象
大量的请求没有命中缓存数据,直接打入了数据库,并且数据库中也没有对应的数据
解决方案
从数据库中查询时只要没有查到,在缓存中设置一个对应的null值
缓存击穿
现象
某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
解决方案
将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。