布谷鸟过滤器的使用

通过 docker / docker-compose 部署 rebloom,创建并验证布谷鸟过滤器,通过 golang 连接 redis 使用,并增加连接池。

实用案例

docker-compose.yaml:

1
2
3
4
5
6
7
8
rebloom:
image: redislabs/rebloom
container_name: rebloom
restart: always
ports:
- 6379:6379
volumes:
- ./rebloom:/data
1
2
3
4
5
6
7
8
9
10
11
//启动
docker-compose up -d --build

//进入容器:
docker exec -it rebloom /bin/bash

//进入 redis-cli
redis-cli

//初始化过滤器. 例:用于去重 url,设置过滤器名称为 url,估算容量为 1 亿
CF.RESERVE url 100000000

通过 CF.INFO url 查看已创建的过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> CF.INFO url
1) Size
2) (integer) 134217784
3) Number of buckets
4) (integer) 67108864
5) Number of filters
6) (integer) 1
7) Number of items inserted
8) (integer) 187359
9) Number of items deleted
10) (integer) 0
11) Bucket size
12) (integer) 2
13) Expansion rate
14) (integer) 1
15) Max iterations
16) (integer) 20

使用方式:

1
2
3
4
127.0.0.1:6379> CF.ADD url "google.com"
(integer) 1
127.0.0.1:6379> CF.EXISTS url "google.com"
(integer) 1

注意事项

  1. 应当在创建过滤器初期,估算好需要的容量,虽然支持自动扩容,但是扩容会导致查询性能下降,不建议使用。

扩容的原理

通过增加 filter 的层数,每一次增加的容量会是之前的 2 倍,查询的时候需要遍历每一层的 filter。

golang 使用 redisBloom 案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import (
redisbloom "github.com/RedisBloom/redisbloom-go"
)

// redis 连接池
redisPool = &redis.Pool{
Dial: func() (redis.Conn, error) {
conn, err := redis.DialURL(Addr)
if err != nil {
log.Fatal("redis conn error", err)
}

return conn, err
},
MaxIdle: 300,
MaxActive: 400,
Wait: true,
}

// redis client
func getRedisBloomClient() *redisbloom.Client {
return redisbloom.NewClientFromPool(redisPool, "default")
}

// Add
getRedisBloomClient().CfAdd("url", "google.com")

// Exist
getRedisBloomClient().CfExists("url", "google.com")