解决redis缓存穿透--布隆过滤器

如何在海量数据中快速判断元素是否存在??

假设

  • 利用位图标记数据是否存在,假设1为存在,0为不存在。
    位图(位数组) Bieset
000000001
  • 海量数据是不同的数据,想要都用 0和1标记,并且要占满(分布均匀)整个位图,可以采用哈希算法(散列算法)

  • 由于哈希算法会出现哈希碰撞,解决哈希碰撞的方法可以有扩容、再哈希等等。。于是引出布隆
    过滤器(Bloom Filter)

  • 网上对它的解释 :它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

  • 此时我们就解决了文章开头提出的问题。

什么是缓存穿透
  • 网上对它的解释 :用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
  • 了解了缓存穿透后我们就能发现,起初提出的: 如何在海量数据中快速判断元素是否存在,它的答案就是解决缓存穿透的办法即 布隆过滤器(BF)。
    补:BF没有删除数据的方法,带计数器的布隆过滤器(CountingBloomFilter)有一个remove方法可以删除,如图所示:
    a和c两个元素都有一次哈希值在同一个位置,此时计数器会记录在这个位置标记的次数,删除时会先删除计数器中的记录数直至为0,才修改位图中的标记1为0.
    在这里插入图片描述
    (做这个测试时,快速插入大量数据可以使用JDBC - PreparedStatement - addbatch() 方法)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值