缓存雪崩
缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
可能的情况有以下两种:
1、全部数据设置的缓存时间同时到期,导致所有请求全部打在关系型数据库上,造成请求雪崩,很有可能把数据库压崩导致服务宕机
2、redis服务因为某些原因宕机,导致所有请求全部打在关系型数据库上
解决方案:
事前:尽量保证整个 redis 集群的高可用性,设置好主从分布+哨兵监听,发现机器宕机尽快补上。选择合适的内存淘汰策略。
事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL崩掉
事后:利用 redis 持久化机制保存的数据尽快恢复缓存
缓存击穿
缓存击穿通常是故意的,属于黑客攻击的一种手段,抛出大量不存在的key,跳过redis直接打在关系型数据库上,达到让数据库崩溃的目的
解决方案:
1、缓存无效 key : 如果缓存和数据库都查不到某个 key 的数据就写一个到 redis 中去并设置过期时间,这种方式只可以解决请求的 key 变化不频繁的情况,并且不能根本性的解决问题
2、通过布隆过滤器,过滤掉非法的key,保护数据库