Redis-bloom filter
對比
和hyperloglog相比 bloomfilter占用空間大
多了contains方法
優(yōu)點
- 不存儲元素本身(某些保密場景也很好用)
- 存儲空間和插入/查詢時間都是On
缺點
誤算,不能刪除元素(因為無法百分百確定元素在不在)
使用場景
新聞客戶端實現(xiàn)推薦去重;
查詢犯罪歷史啥的,還可以保密.
介紹
redis4.0 之后支持插件支持布隆過濾器
支持顯示創(chuàng)建布隆過濾器 使用bf.server創(chuàng)建.
原理
圖 -- 網(wǎng)上隨便搜都能在找到
添加元素的原理
- 將要添加的元素給k個hash函數(shù)
- 得到對應于位數(shù)組上的k個位置
- 將這k個位置設置成 1
查詢元素原理
- 將要查詢的元素給k個hash函數(shù)
- 得到對應數(shù)組的k個元素
- 如果k個位置中有一個為0,則肯定不在集合中
4.如果k個位置全部為1,則有可能在集合中
bf.server 的三個參數(shù):
默認值; error_rate =0.01 ,initial_size=100;
key:這個不用說了.
initial_size: 預計放入的元素數(shù)量,實際數(shù)量超過這個數(shù)量,誤判率會上升.
error_rate:預期的誤判率.
錯誤率越低,需要的空間越大.
127.0.0.1:6379> bf.add codehole user1
(integer) 1
127.0.0.1:6379> bf.add codehole user2
(integer) 1
127.0.0.1:6379> bf.add codehole user3
(integer) 1
127.0.0.1:6379> bf.exists codehole user1
(integer) 1
127.0.0.1:6379> bf.exists codehole user2
(integer) 1
127.0.0.1:6379> bf.exists codehole user3
(integer) 1
127.0.0.1:6379> bf.exists codehole user4
(integer) 0
127.0.0.1:6379> bf.madd codehole user4 user5 user6
1) (integer) 1
2) (integer) 1
3) (integer) 1
127.0.0.1:6379> bf.mexists codehole user4 user5 user6 user7
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 0