Node Redis 示例教程:从基础到高级应用实战
node-redis 项目地址: https://gitcode.com/gh_mirrors/noder/node-redis
前言
Node Redis 是 Node.js 生态中最流行的 Redis 客户端之一,提供了丰富而强大的功能来与 Redis 数据库交互。本教程将深入解析 Node Redis 的各种使用场景,帮助开发者掌握从基础操作到高级特性的全方位应用。
基础连接与状态检查
连接状态检查
在 check-connection-status.js
示例中,展示了如何检查客户端连接状态。这对于确保应用与 Redis 服务的稳定连接至关重要。
// 创建客户端并检查连接状态
const client = createClient();
await client.connect();
// 检查连接是否已建立
const isConnected = client.isReady;
console.log(`连接状态: ${isConnected ? '已连接' : '未连接'}`);
ACL 用户连接
Redis 6.0 引入了 ACL(访问控制列表)功能,connect-as-acl-user.js
展示了如何使用特定权限的用户进行连接:
const client = createClient({
username: 'your-username',
password: 'your-password'
});
数据结构操作实战
列表阻塞操作
blocking-list-pop.js
演示了 Redis 的阻塞式列表弹出操作,这是实现消息队列和任务调度的重要特性:
// 阻塞直到获取列表元素
const element = await client.blPop('myList', 0); // 0表示无限等待
有序集合应用
sorted-set.js
展示了有序集合的典型用法,适用于排行榜等场景:
// 添加带分数的成员
await client.zAdd('leaderboard', [
{ score: 100, value: 'player1' },
{ score: 85, value: 'player2' }
]);
// 使用迭代器扫描集合
for await (const member of client.zScanIterator('leaderboard')) {
console.log(member);
}
高级数据结构与模块
HyperLogLog 基数统计
hyperloglog.js
展示了如何使用 HyperLogLog 进行高效基数统计:
// 添加元素到HyperLogLog
await client.pfAdd('visitors', 'user1', 'user2');
// 获取不重复元素数量估计
const count = await client.pfCount('visitors');
RedisBloom 应用
RedisBloom 模块提供了多种概率数据结构:
-
布隆过滤器 (
bloom-filter.js
):await client.bf.add('filter', 'item1'); const exists = await client.bf.exists('filter', 'item1');
-
Count-Min Sketch (
count-min-sketch.js
):await client.cms.initByDim('sketch', 1000, 5); await client.cms.incrBy('sketch', 'event1', 1);
-
Top-K (
topk.js
):await client.topK.reserve('popularItems', 5); await client.topK.add('popularItems', 'item1');
流处理与发布订阅
Redis 流处理
-
生产者 (
stream-producer.js
):await client.xAdd('mystream', '*', { temperature: '23.5', humidity: '45%' });
-
消费者 (
stream-consumer.js
):const messages = await client.xRead( { key: 'mystream', id: '$' }, { BLOCK: 0 } );
-
消费者组 (
stream-consumer-group.js
):await client.xGroupCreate('mystream', 'mygroup', '$'); const messages = await client.xReadGroup( 'mygroup', 'consumer1', { key: 'mystream', id: '>' } );
发布订阅模式
pubsub-publisher.js
和 pubsub-subscriber.js
展示了经典的发布订阅实现:
// 订阅者
await client.pSubscribe('channel*', (message, channel) => {
console.log(`收到 ${channel} 的消息: ${message}`);
});
// 发布者
await client.publish('channel1', 'Hello World!');
事务与 Lua 脚本
事务处理
-
基本事务 (
transaction-with-arbitrary-commands.js
):const [setResult, incrResult] = await client .multi() .set('key', 'value') .incr('counter') .exec();
-
乐观锁 (
transaction-with-watch.js
):await client.watch('key'); const value = await client.get('key'); const multi = client.multi(); multi.set('key', Number(value) + 1); await multi.exec();
Lua 脚本
lua-multi-incr.js
展示了如何通过 Lua 脚本实现原子性多键操作:
const script = `
for i, key in ipairs(KEYS) do
redis.call('INCRBY', key, ARGV[i])
end
`;
await client.eval(script, {
keys: ['key1', 'key2'],
arguments: ['10', '20']
});
Redis 模块集成
RediSearch 应用
-
哈希搜索 (
search-hashes.js
):await client.ft.create('idx', { '$.name': { type: 'TEXT' } }, { ON: 'HASH' });
-
JSON 搜索 (
search-json.js
):await client.json.set('doc1', '$', { name: 'John', age: 30 }); await client.ft.search('idx', '@age:[30 40]');
-
向量搜索 (
search-knn.js
):await client.ft.create('vecIdx', { '$.vector': { type: 'VECTOR', ALGORITHM: 'HNSW', TYPE: 'FLOAT32', DIM: 128 } });
时间序列
time-series.js
展示了 RedisTimeSeries 的使用:
await client.ts.create('temperature');
await client.ts.add('temperature', Date.now(), 23.5);
const range = await client.ts.range('temperature', '-', '+');
最佳实践与开发规范
-
代码风格:
- 使用 2 空格缩进
- 统一使用单引号
- 必须包含分号
- 使用 async/await 处理异步
-
示例设计:
- 每个示例应聚焦单一功能点
- 包含必要的注释说明
- 使用有意义的测试数据
- 考虑错误处理场景
-
性能考虑:
- 合理使用管道(pipeline)
- 批量操作代替单次操作
- 适当使用连接池
结语
通过本文介绍的各种示例,开发者可以全面掌握 Node Redis 客户端的强大功能。从基础数据结构操作到高级模块集成,从简单的键值存储到复杂的流处理系统,Node Redis 都能提供优雅的解决方案。建议读者结合实际项目需求,选择适合的特性进行深入实践。
node-redis 项目地址: https://gitcode.com/gh_mirrors/noder/node-redis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考