这里有一个测试数据:
文章插图
后面4列中的数据就是发生误差的数量 。可见 , 空间大小和集合大小不变的情况下 , 增加hash函数可以显著减小误差 。但一旦集合大小达到空间大小的25%左右后 , 增加hash函数带来的提神效果并不明显 。这个时候应该增加空间大小 。
redis中的布隆过滤器
Redis的布隆过滤器不是原生自带的 , 而是要通过module加载进去 。Redis在4.0的版本中加入了module功能 。具体使用可以直接看RedisBloom github的README:github.com/RedisBloom/…
Redis的布隆过滤器主要有两个命令:
- bf.add 添加元素到布隆过滤器中:bf.add strs xy
- bf.exists 判断某个元素是否在过滤器中:bf.exists strs xy
bf.reserve strs 0.01 100复制代码三个参数的含义:
- 第一个值是过滤器的名字 。
- 第二个值为error_rate的值:允许布隆过滤器的错误率 。
- 第三个值为initial_size的值:初始化位数组的大小 。
如果你的项目没有使用Redis , 那可以使用一些开源库 , 基于代码实现 , 直接存放在内存 。比如google的guava包中提供了BloomFilter类 , 有兴趣的读者可以去了解一下 , 研究研究源码和使用 。
布谷鸟过滤器
RedisBloom模块还实现了布谷鸟过滤器 , 它算是对布隆过滤器的增强版 。解决了布隆过滤器的一些比较明显的缺点 , 比如:不能删除元素 , 不能计数等 。除此之外 , 布谷鸟过滤器不用使用多个hash函数 , 所以查询性能更高 。除此之外 , 在相同的误判率下 , 布谷鸟过滤器的空间利用率要明显高于布隆 , 空间上大概能节省40%多 。
笔者个人觉得 , 对于大多数场景来说 , 布隆过滤器足以解决我们的问题 。掘金上有一篇深度分析布谷鸟过滤器的文章 , 有兴趣的读者可以去了解一下:juejin.im/post/5cfb9c…
认真写文章 , 用心做分享 。
个人网站:yasinshaw.com
公众号:xy的技术圈
推荐阅读
- Redis哈希类型
- 你知道 Redis数据结构底层实现吗?一文详解,彻底弄懂
- redis实现网关限流
- 如何在Linux中配置Redis服务并设置为开机自启
- redis的场景应用多角度简单分析
- redis之缓存穿透、缓存击穿和缓存雪崩
- 深度原理学习–Redis集群
- redis分布式锁 Redlock原理分析
- 初识Redis
- Redis主从服务搭建