redis中缓存穿透的深入理解

1.redis缓存穿透

缓存穿透:当我们查询一个一定不存在的数据的时候,请求不会经过redis,而是直接在数据库中查询,查询不到的数据也不会直接写入缓存,就会导致每次请求都会去查数据库,数据库压力太大而当机。这种情况往往是遭到了别人的攻击

解决方案:

  1. 缓存空数据:
    • 在数据库中查询返回的数据为空,仍把这个空结果进行缓存
    • 但是这个方案有弊端:消耗内存,且会出现数据不一致问题,如果后面我们给这个空数据赋了值,会导致重新赋值的结果出不来,依然返回的null
  2. 添加布隆过滤器
    • 当进行查询时会经过布隆过滤器,再到redis,如果布隆过滤器中不存在则拦截直接返回,存在才放给redis/数据库去查询。
    • 这里有一个前提,就是在做缓存预热的时候也需要预热布隆过滤器(初始化),在批量从数据库中把添加到缓存的同时, 把这些值通过hash计算之后存储到布隆过滤器的bitmap中
    • 布隆过滤器中有一个bitmap的位图,是一个以bit为单位的数组,数组中每个单元只存储二进制数01,布隆过滤器主要的实现就是依赖于这个bitmap,利用这个位图来检索一个元素是否存在于一个集合中。
    • 存储数据:会对这个数据进行多次(3次)hash计算,获取hash值,得到在数组中对应的索引位置,再把这些位置的值由0改为1(初始化的时候都为1)。
    • 查询数据:使用相同的hash函数进行hash计算获取hash值,判断对应的位置的值是否都为1,如果为1说明值是存在的,有一个不为1说明不存在
    • image-20231207085911126
    • 误判:可能会存在误判 当我们查询的一个空值的时候,如果hash计算出来的结果正好和其他数据的hash结果相同,那么会被误判为该数据存在
      -image-20231207091222968
    • 通过设置误判率来解决误判问题,设置在5%
  3. 总结:
  4. image-20231207090817093
  • 39
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烂泥732

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值