缓存击穿、缓存雪崩、缓存穿透

在实际应用中,我们会在程序和数据库之间增加一个缓存层,一方面是为了提升数据的检索效率,提升程序的性能,另一方面是为了缓解数据库的一个并发压力

怎么防止缓存击穿:

缓存击穿是因为客户端恶意发送一些大量不存在的key的请求,由于访问的key,对应的数据本身不存在,所以每一次必然都会穿透到数据库里面,导致缓存成为摆设。

对于此类场景,

第一种,可以在接口层增加校验,对确定没有的key,进行拦截;

第二种,可以将这些不存在的key,保存在缓存中,设置比较短的缓存时间;

第三种:也可以使用布隆过滤器,应用启动的时候把存在的数据缓存存到布隆过滤器里面,每一次请求过来的时候,先访问布隆过滤器,如果不存在则说明这个数据一定没有在数据库,就没必要再访问数据库;


布隆过滤器:布隆过滤器是由位数组(二进制)和多个哈希函数组成的概率数据结构,返回结果只有可能存在和一定不存在;
过滤器里的一个元素由多个状态值共同确定。位数组(二进制)存储状态值,哈希函数计算状态值的位置。

怎么防止缓存雪崩:
缓存雪崩因为一些缓存在同一个时间集中过期,或者缓存服务器宕机,导致大量请求直接访问数据库,造成数据库瞬间压力过大,宕机。
针对第一个场景,我们可以加一个随机失效时间,加锁队列,
第二个场景,我们就可以给redis做集群搭建,哨兵模式,如果是机房因为灾祸等原因,就需要切换另一个地方的机房

怎么防止缓存击穿:
缓存击穿因为redis里面保存的热点key,在缓存过期的瞬间,有大量的请求进来;
对于此类场景,第一种,对于热点数据,我们可以不设置过期时间。或者在访问数据的时候对数据过期时间进行延续,
第二种,对于访问量比较高的缓存数据,我们可以设计多级缓存,尽量减少数据库的压力
第三种,用分布式锁,当发现缓存失效时,不是先从数据库加载,而是先获取分布式锁,获得分布式锁的线程从数据库查询数据库后写到
缓存中

posted @ 2023-07-01 10:49  丶Ronnie  阅读(23)  评论(0)    收藏  举报