Skip to content

Latest commit

 

History

History
87 lines (60 loc) · 3.6 KB

7.布隆过滤器.md

File metadata and controls

87 lines (60 loc) · 3.6 KB

布隆过滤器

什么是布隆过滤器

  • 布隆过滤器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出,它是一种 space efficient 的概率型数据结构,用于判断一个元素是否在集合中。

  • 当布隆过滤器说,某个数据存在时,这个数据可能不存在;当布隆过滤器说,某个数据不存在时,那么这个数据一定不存在。

  • 相比于 Set 集合的去重功能而言,布隆过滤器在空间上能节省 90% 以上,但是它的不足之处是去重率大约在 99% 左右,也就是说有 1% 左右的误判率,这种误差是由布隆过滤器的自身结构决定的。俗话说“鱼与熊掌不可兼得”,如果想要节省空间,就需要牺牲 1% 的误判率,而且这种误判率,在处理海量数据时,几乎可以忽略。

  • 哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的 1/8 或 1/4 的空间复杂度就能完成同样的问题。

  • 布隆过滤器可以插入元素,但不可以删除已有元素。

  • 其中的元素越多,false positive rate(误报率)越大,但是 false negative (漏报)是不可能的。

下载

编译安装,需要从 github 下载,下载地址:https://github.com/RedisBloom/RedisBloom

编译插件

cd RedisBloom-2.2.14
make
编译成功,生成 redisbloom.so 文件

安装集成

需要修改 redis.conf 文件,新增 loadmodule配置,并重启 Redis。

loadmodule /usr/local/RedisBloom-2.2.14/redisbloom.so

缓存穿透:

意味着有特殊请求在查询一个不存在的数据,即数据不存在 Redis 也不存在于数据库。

  1. 创建布隆过滤器:
# BF.RESERVE {key} {error_rate} {capacity} [EXPANSION {expansion}] [NONSCALING]
BF.RESERVE orders 0.1 10000000

key:filter 的名字;
error_rate:期望的错误率,默认 0.1,值越低,需要的空间越大;
capacity:初始容量,默认 100,当实际元素的数量超过这个初始化容量时,误判率上升。
EXPANSION:可选参数,当添加到布隆过滤器中的数据达到初始容量后,布隆过滤器会自动创建一个子过滤器,子过滤器的大小是上一个过滤器大小乘以 expansion;expansion 的默认值是 2,也就是说布隆过滤器扩容默认是 2 倍扩容;
NONSCALING:可选参数,设置此项后,当添加到布隆过滤器中的数据达到初始容量后,不会扩容过滤器,并且会抛出异常((error) ERR non scaling filter is full) 说明:BloomFilter 的扩容是通过增加 BloomFilter 的层数来完成的。每增加一层,在查询的时候就可能会遍历多层 BloomFilter 来完成,每一层的容量都是上一层的两倍(默认)。
  1. 添加信息到过滤器
# BF.ADD {key} {item}
BF.ADD orders 10086
BF.MADD orders 10086 10087
  1. 判断是否存在
# BF.EXISTS {key} {item}
BF.EXISTS orders 10086

BF.EXISTS 判断一个元素是否存在于BloomFilter返回值 = 1 表示存在。
如果需要批量检查多个元素是否存在于布隆过滤器则使用 BF.MEXISTS返回值是一个数组1存在0不存在。
# BF.MEXISTS {key} {item}
BF.MEXISTS orders 100 10089
  1. 查看创建的布隆过滤器信息
BF.INFO orders

返回值:
Capacity:预设容量;
Size:实际占用情况,但如何计算待进一步确认;
Number of filters:过滤器层数;
Number of items inserted:已经实际插入的元素数量;
Expansion rate:子过滤器扩容系数(默认 2);