Redis——布隆净化器
原创-
安装使用
- rebloom作为插件安装 centos安装rebloom
-
docker安装:
// 拉取镜像 docker pull redislabs/rebloom // 后台运行,映射到本地6380端口 docker run -d -p 6380:6379 redislabs/rebloom // 连接 redis-cli -p 6380
-
Bloom滤波器的主要阶数和误判
- bf.add: 语法:[bf.add key value] 返回1添加成功
- bf.exists: 语法:[bf.exists key value] 返回1表示存在
- madd, mexists是加法和判断倍数value
当Blom筛选器显示值存在时,该值可能不存在。;当它说它不存在时,它肯定不存在。
-
基本使用
// 连接redis操作 conn, err := redis.Dial("tcp", "127.0.0.1:6380") HandlecError(err, "connect") defer func() { _ = conn.Close() }() // 测试redisBloom过滤器 res, err := conn.Do("bf.add", "reBloom", "user100") fmt.Println(res, err) res2, err2 := conn.Do("bf.exists", "reBloom", "user1") fmt.Println(res2, err2) -
go测试误判小实验
// 每一代不同的key testKey := uuid.NewV4().String() // 对于那些已经被添加到Blom过滤器的人,他可以肯定地判断它存在(res=1) for i := 1; i < 100000 ; i++ { _, _ = conn.Do("bf.add", testKey, "user" + strconv.Itoa(i)) res, _ = conn.Do("bf.exists", testKey, "user" + strconv.Itoa(i)) if res.(int64) == 0{ fmt.Println(i) break } } // 测试结果: 不会误判 // 对于那些没有添加Blom过滤器的人,他可能会误判存在(res=1) for i := 1; i < 100000 ; i++ { _, _ = conn.Do("bf.add", testKey, "user" + strconv.Itoa(i)) res, _ = conn.Do("bf.exists", testKey, "user" + strconv.Itoa(i + 1)) if res.(int64) == 1{ fmt.Println(i) break } } // 测试结果: i=310就误判了
Blom过滤器可以自定义参数。,需要我们加入 add 之前使用 bf.reserve 指令是显式创建的。如果相应的 key 已经存在,bf.reserve 会报错。bf.reserve 有三个参数: 分别是 key, error_rate 和 initial_size错误率越低,所需空间越大。initial_size 该参数表示预期版本。 中的元素数量,当实际数量超过此值时,错误率会增加。
- 布隆过滤器原理

- Blom过滤器的数据结构内部是一个大的位数组和几个不同的无偏(把元素的 hash该值相对均匀。) hash函数, 对每个key多次执行。hash
- 添加到Blom筛选器 key 使用多个 hash 函数对 key 进行 hash 计算整数索引值, 然后对比特阵列的长度进行建模,以获得每个比特阵列的位置。 hash 该函数将计算不同的位置。然后设置位数组的这些位置1 就完成了 add 操作。
- 询问Blom筛选器 key 无论是否存在,请遵循 add 同样,也将 hash 计算多个位置,以查看位阵列中的这些位置是否都是位。 1… 只要有一点 0,然后在Blom筛选器中对此进行解释 key不存在。如果全部 1,这并不意味着key 它必须存在,但它很可能存在,因为 某些位已设置 1 可能是因为其他原因 key 由于存在。
- Bloom Filter的应用场景
- 推荐的内容不重。
- 爬虫URL去重
- 邮箱系统的垃圾邮件过滤
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
上一篇:Redis队列——信息队列,延时队列 下一篇:Redis——公平锁
itfan123



