引言
我们都知道,缓存固然好,省流量,速度快,但缓存也有“不行”的时候,Redis作为一个缓存数据库也存在这三大缓存问题。
缓存穿透
原因及场景
简单来说就是查询缓存和底层DB中都不存在数据,而用户却不断的发起请求,在流量高峰的时候,就特别容易使DB崩溃。
解决方案
- 直接缓存空数据,如下用户一直请求id为1234的数据,缓存和DB中并没有这条数据,直接在缓存NULL。如图操作
- 添加布隆过滤器,实现复杂,存在误判率(本人不经常使用)。
缓存击穿
原因及场景
一般场景就是缓存中某一个Key过期的瞬间,对这个Key发生了大量的请求,缓存中没有数据,大量请求去读底层DB,可能会把底层数据库压垮。
解决方案
- 对数据有强一致的需求,添加互斥锁,对请求中的某一个线程上互斥锁,在该线程拿到锁的时候添加缓存。大致意思就是,一个人说,你们先稍息,听我讲话看我操作,然后其余人再操作。这种方案,性能较差,但是数据一致。
- 对热点缓存不设置过期时间,性能优,高可用,数据一致性差。
缓存雪崩
原因及场景
缓存雪崩存在着严重的偶然性,意思就是同一时间内动量的缓存key同时失效或者redis服务宕机。
解决方案
- 给Key设置过期时间时使用随机值。
- 利用Redis集群,采用哨兵模式或者集群模式,提高服务的可用性。
- 添加多级缓存
- 设置热点数据永不过期一定程度上也可以解决。