语法
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
捕获异常,防止因布隆过滤器已存在等原因报错导致流程中断。