跳到主要内容

语法

2025年02月22日
柏拉文
越努力,越幸运

一、认识


基于 ioredis 调用 RedisBloom 模块命令实现布隆过滤器的示例。假设你的 Redis 实例已经加载了 RedisBloom 模块(例如通过 redis-server --loadmodule redisbloom.so 启动),你可以使用 ioredis 发送自定义命令来创建布隆过滤器、添加元素和判断元素是否存在。

二、语法


const Redis = require('ioredis');

// 创建 Redis 客户端
const redis = new Redis({
host: '127.0.0.1',
port: 6379,
});

// 使用 RedisBloom 的命令创建布隆过滤器
async function createBloomFilter() {
try {
// BF.RESERVE key error_rate capacity
// 例如创建一个误判率 0.01、预期存储 10000 个元素的布隆过滤器 myfilter
const result = await redis.call('BF.RESERVE', 'myfilter', '0.01', '10000');
console.log('创建布隆过滤器成功:', result);
} catch (err) {
// 如果布隆过滤器已经存在,可能会报错,此时可以忽略或处理错误
console.error('创建布隆过滤器失败:', err.message);
}
}

// 添加元素到布隆过滤器
async function addElement(element) {
try {
// BF.ADD key item
const result = await redis.call('BF.ADD', 'myfilter', element);
// 返回 1 表示该元素之前不存在,0 表示可能已经存在
console.log(`添加元素 "${element}" 结果:`, result);
} catch (err) {
console.error(`添加元素 "${element}" 失败:`, err.message);
}
}

// 查询元素是否存在
async function existsElement(element) {
try {
// BF.EXISTS key item
const result = await redis.call('BF.EXISTS', 'myfilter', element);
// 返回 1 表示可能存在,0 表示一定不存在
console.log(`元素 "${element}" 是否存在:`, result);
} catch (err) {
console.error(`查询元素 "${element}" 失败:`, err.message);
}
}

// 示例:先创建布隆过滤器,再添加和查询元素
async function testBloomFilter() {
await createBloomFilter();
await addElement('hello');
await existsElement('hello'); // 期望返回 1(可能存在)
await existsElement('world'); // 期望返回 0(一定不存在,如果没有添加过)

// 添加其它元素
await addElement('world');
await existsElement('world'); // 此时返回 1
}

testBloomFilter()
.then(() => {
console.log('布隆过滤器操作测试完成');
redis.disconnect();
})
.catch(err => {
console.error('测试过程中发生错误:', err);
redis.disconnect();
});

1. 创建 Redis 客户端: 使用 ioredis 创建 Redis 连接,确保连接参数与实际 Redis 实例一致。

2. 创建布隆过滤器(BF.RESERVE: 调用 BF.RESERVE 命令创建一个布隆过滤器。参数依次为:

  • key: 此处为 myfilter

  • capacity: 预期存储的元素数量,例如 10000

  • error_rate: 误判率,这里设置为 0.01

3. 添加元素(BF.ADD: 调用 BF.ADD 命令添加元素到布隆过滤器,返回值为 1 表示该元素之前不存在(成功添加),返回 0 则表示该元素可能已存在。

4. 查询元素(BF.EXISTS: 调用 BF.EXISTS 命令判断元素是否存在,返回 1 表示可能存在,返回 0 表示一定不存在。

5. 错误处理: 代码中对各个操作进行了 try/catch 捕获异常,防止因布隆过滤器已存在等原因报错导致流程中断。