redis缓存穿透

相关阅读

缓存穿透

缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。

  • 影响:

    • 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。
    • 缓存穿透问题可能会使后端存储负载加大,由于很多后端持久层不具备高并发性,甚至可能造成后端存储宕机。
    • 通常可以在程序中统计总调用数、缓存层命中数、如果同一个Key的缓存命中率很低,可能就是出现了缓存穿透问题。
  • 缓存穿透原因:

    • 自身业务代码或数据出现了问题(例如:set 和 get 的key不一致)
    • 一些恶意攻击或爬虫等造成大量不存在数据查询。(爬取线上商城商品数据,超大循环递增商品的ID)
  • 解决方案

    • 实时监控:
      对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务(拒绝黑客攻击)
  • 接口校验
    类似于用户权限的拦截,对于id=-3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。

    • 缓存空对象:

      指在持久层没有命中的情况下,对key进行set (key,null),并设置一个过期时间

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

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

      如果实在无法忍受不一致的情况,那么需要调整缓存更新策略,查询不到将key的value置空,修改时删除缓存,再次查询不到key写入缓存

    • 布隆过滤器:bitmap

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

      布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。

      它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

      布隆过滤器拦截的算法描述:

      初始状态时,BloomFilter是一个长度为m的位数组,每一位都置为0。

      添加元素x时,x使用k个hash函数得到k个hash值,对m取余,对应的bit位设置为1。

      判断y是否属于这个集合,对y使用k个哈希函数得到k个哈希值,对m取余,所有对应的位置都是1,则认为y属于该集合(哈希冲突,可能存在误判),否则就认为y不属于该集合。可以通过增加哈希函数和增加二进制位数组的长度来降低错报率。

    • 对比

      解决缓存穿透适用场景维护成本
      缓存空对象数据命中率不高,数据频繁变化实时性高代码简单,需要过多内存,数据不一致
      布隆过滤器数据命中率不高,数据相对固定,实时性低代码维护复杂,内存占用少
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值