RedisBloom 为 Redis 添加了一套概率数据结构,包括布隆过滤器(Bloom filter)、库克过滤器(Cuckoo filter)、计数最小草图(Count-min sketch)、Top-K 和 t-digest。通过使用这些数据结构,你可以在无需存储所有流元素的情况下查询流数据。每种概率数据结构能够回答特定类型的问题,如下所示:
- 布隆过滤器和库克过滤器:某个值是否已经出现过?
- 计数最小草图:某个值出现过多少次?
- Top-K:数据流中最常见的 k 个值是什么?
- t-digest:数据流中有多少值小于给定值?某个值在数据流中的百分位数是多少?
回答这些问题可能需要大量的内存,但你可以通过设置可控的准确性和内存消耗之间的权衡来显著降低内存需求。概率数据结构通常比准确算法速度更快,占用的内存也更少。
RedisBloom 的使用使得在高效处理数据流时不必存储所有元素,通过精确地设置数据结构的参数,您可以在内存使用和查询性能之间做出最佳平衡。
安装 RedisBloom
你可以选择在 Docker 容器中或在本地机器上安装 RedisBloom。
使用 Docker 安装
要快速尝试 RedisBloom,你可以使用 Docker 启动一个实例:
docker run -p 6379:6379 -it --rm redis/redis-stack-server:latest
RedisBloom 是 Redis Stack 的一部分,因此一旦您安装了 Redis Stack,您就可以使用前面介绍的所有这些概率数据结构来优化您的数据处理流程。
自行安装
如果你更愿意在本地机器上构建 RedisBloom,以下是操作步骤。支持的操作系统包括主要的 Linux 发行版和 macOS。
1. 安装 Redis
首先,你需要安装 Redis。以下示例展示了如何在一个干净的 Ubuntu Docker 镜像中构建 Redis:
mkdir ~/Redis
cd ~/Redis
apt-get update -y && apt-get upgrade -y
apt-get install -y wget make pkg-config build-essential
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make distclean
make
make install
2. 获取并构建 RedisBloom
接下来,获取 RedisBloom 的 Git 仓库并构建它:
apt-get install -y git
cd ~/Redis
git clone --recursive https://github.com/RedisBloom/RedisBloom.git
cd RedisBloom
./sbin/setup
bash -l
make
然后退出 bash。
注意:如果需要获取 RedisBloom 的特定版本,例如 2.4.5,可以在
git clone
命令中添加-b v2.4.5
。
3. 配置 Redis 加载 RedisBloom 模块
运行 make run -n
并复制 RedisBloom 可执行文件的完整路径(例如 /root/Redis/RedisBloom/bin/linux-x64-release/redisbloom.so
)。
然后,将 RedisBloom 模块添加到 redis.conf
文件中,使 Redis 启动时加载该模块:
apt-get install -y vim
cd ~/Redis/redis-stable
vim redis.conf
在 MODULES
部分添加以下行(使用上一步复制的完整路径):
loadmodule /root/Redis/RedisBloom/bin/linux-x64-release/redisbloom.so
保存并退出 vim(按 ESC
然后输入 :wq
,最后按 ENTER
)。
有关模块的更多信息,请参见 Redis 官方文档。
4. 运行 Redis
在后台运行 Redis 服务器,然后启动 Redis CLI:
cd ~/Redis/redis-stable
redis-server redis.conf &
redis-cli
使用 RedisBloom
安装 RedisBloom 后,你可以使用 Redis CLI 进行交互。
创建一个新的布隆过滤器并添加一个项目:
# 127.0.0.1:6379> BF.ADD newFilter foo
(integer) 1
检查项目是否存在于过滤器中:
# 127.0.0.1:6379> BF.EXISTS newFilter foo
(integer) 1
在这个例子中,返回 1 表示 foo
很可能在由 newFilter
表示的集合中。然而,请注意布隆过滤器可能会产生假阳性。
检查另一个项目是否存在于过滤器中:
# 127.0.0.1:6379> BF.EXISTS newFilter bar
(integer) 0
返回 0 表示 bar
肯定不在集合中。布隆过滤器不允许假阴性。
以上就是如何安装和使用 RedisBloom 的完整指南。通过这些步骤,你可以轻松设置 RedisBloom,并开始利用布隆过滤器等概率数据结构进行高效的数据处理。