一、缓存穿透
大量查询访问一个缓存中不存在的key,导致大量请求直接查询到数据库,这种查询不存在的缓存数据就叫做缓存穿透。
解决:使用布隆过滤器,将所有有效的key缓存到一个集合中,不存在的key,直接返回空。
二、缓存击穿
大量访问查询 刚好缓存失效的key,那么刚好全部请求只能请求到数据库,这种现象就叫做缓存穿透。
解决办法:当key失效时 对更新操作进行阻塞,只允许单个线程进行 更新这个缓存。更新结束后,所有线程重新再在缓存里面获取这个key的数据。
三、缓存雪崩
当某一个时刻,大量的key都失效,比如缓存服务器宕机了,那么这些请求都查询到数据库,导致数据也撑不住直接宕机了,那整个服务都无法使用了。
解决办法: 1.使用redis Cluster 集群模式 实现主从备份,以应急 redis服务器宕机带来的裸库现象。
2.增加失效时间分散度,按照key集合的大小来创建分散的hash值 与 缓存时间进行动态绑定。
3.使用本地缓存,以应对redis缓存无法服务时带来的裸库风险。
4.使用限流机制,对某些服务进行限流操作,超过限制,走限流feelback逻辑。