梳理对redis缓存穿透、雪崩、击穿的理解和处理

缓存穿透

理解:缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。

产生的影响:缓存穿透问题可能会使后端存储负载加大,由于很多后端持久层不具备高并发性,甚至可能造成后端存储宕机。通常可以在程序中统计总调用数、缓存层命中数、如果同一个Key的缓存命中率很低,可能就是出现了缓存穿透问题。

解决方案1:缓存空对象:是指在持久层没有命中的情况下,对key进行set (key,null)缓存空对象会有两个问题:

第一,value为null 不代表不占用内存空间,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。

第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。

解决方案2:布隆过滤器拦截,在访问缓存层和存储层之前,将存在的key用布隆过滤器提前保存起来,做第一层拦截,当收到一个对key请求时先用布隆过滤器验证是key否存在,如果存在在进入缓存层、存储层。可以使用bitmap做布隆过滤器。这种方法适用于数据命中不高、数据相对固定、实时性低的应用场景,代码维护较为复杂,但是缓存空间占用少。

缓存击穿:

理解:很多数据同时过来;,一般是恶意攻击;

解决方案1:加锁;让数据一个一个进来;

             缺点:影响数据的实效行,非常不推荐;,数据处理比较慢,在一个高并发,高可用的场景下,是不可能用加锁的;

解决方案2:是给key设置用不过期;

缓存击穿:指的是某一个key实效的问题;雪崩指的是多个key实效的问题;穿透指的是:查询我们数据库并没有的数据;

缓存雪崩:redis中的key大面积失效;

解决方案1:设置redis的实效时间不要在同一时间时效,在我们设置这个缓存的时候,随机初始化他的实效时间,这样的话就不会让所有的缓存在同一时间失效,把所有的请求都打在数据库上;

解决方案2、设置缓存永久不失效;

解决方案3、不断的用定时任务去刷新缓存的失效时间;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值