星期五呀划波水呀

布隆过滤器

最近在学Redis的时候,看到Redis中解决缓存击穿(就是数据库里面没有的数据在的数据,在redis上面也不会有,然后进程看redis上面没有,就去访问数据库。这种情况一多,容易造成数据库奔溃)的问题时候。看到一种解决方法叫 布隆过滤器,熟悉的赶脚啊。
在学大数据的时候,hdaoop的hbase组件里面也有这种算法。布隆过滤器的大概工作原理就是我捋了一下,把自己学到的整理一下。
布隆过滤器的分成两个重要的部分吧,一个bool[](逻辑数组),因为布隆过滤器只要在数组的相应的位置标记一下,当前这个下标是否是有值的。就完成了对数据的存储。
那么数据又是怎知道,自己该往bool[]的那个位置放嘞。这就是布隆过滤器的第二个部分了。hash算法,在当前的布隆过滤器中定义单个存储的hash值算法(可以多个),将得到的hash值整除bool的长度,得到的数字就是当前元素在布隆过滤器上得存储位置(不存数据,只是表明当前这个元素已在布隆过滤器里面被标记了),就是bool[]中的相应位置设置为true。
举个例子:
我现在有一个布隆过滤器,bool[]长度是10;
现在我有两个元素 “北京”,“南京”。我定了两个hash算法,
1.根据元素的第一个字符求hash值
2.根据元素的第二个字符求hash值,他们整除10之后存储到bool[]中,这个时候bool[]中 只有三个位置设置为了true(“北京”和“南京”,“京”子重复了,所以“南京”存储的时候,会和“北京”的一个hash值重复);
将这个两个元素存储到布隆过滤器中之后,bool[]中只有三个位置为true。
这个时候我检索“南北”,“东京”这两个元素在不在当前这个布隆过滤器中。聪明的宝贝已经知道了,“南北”会被判断为在当前的布隆过滤器中,“东京”不在。
布隆过滤器检索元素的时候是有一定误差的,肯定不存在,概率性存在(可能存在),为什么嘞?
因为根据我们定义的hash算法,“南北”这个元素的hash值正好已经在bool[]中被标记了,而“东京”这个元素根据 1. hash算法算出的hash值不在bool[]中。所以布隆过滤器只会对元素存在有误判几率。不存在则肯定不存在。
所以布隆过滤器很适合redis中解决缓存击穿问题,减少对数据库的多次访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值