Node Redis 示例教程:从基础到高级应用实战

Node Redis 示例教程:从基础到高级应用实战

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 模块提供了多种概率数据结构:

  1. 布隆过滤器 (bloom-filter.js):

    await client.bf.add('filter', 'item1');
    const exists = await client.bf.exists('filter', 'item1');
    
  2. Count-Min Sketch (count-min-sketch.js):

    await client.cms.initByDim('sketch', 1000, 5);
    await client.cms.incrBy('sketch', 'event1', 1);
    
  3. Top-K (topk.js):

    await client.topK.reserve('popularItems', 5);
    await client.topK.add('popularItems', 'item1');
    

流处理与发布订阅

Redis 流处理

  1. 生产者 (stream-producer.js):

    await client.xAdd('mystream', '*', {
      temperature: '23.5',
      humidity: '45%'
    });
    
  2. 消费者 (stream-consumer.js):

    const messages = await client.xRead(
      { key: 'mystream', id: '$' },
      { BLOCK: 0 }
    );
    
  3. 消费者组 (stream-consumer-group.js):

    await client.xGroupCreate('mystream', 'mygroup', '$');
    const messages = await client.xReadGroup(
      'mygroup', 'consumer1', 
      { key: 'mystream', id: '>' }
    );
    

发布订阅模式

pubsub-publisher.jspubsub-subscriber.js 展示了经典的发布订阅实现:

// 订阅者
await client.pSubscribe('channel*', (message, channel) => {
  console.log(`收到 ${channel} 的消息: ${message}`);
});

// 发布者
await client.publish('channel1', 'Hello World!');

事务与 Lua 脚本

事务处理

  1. 基本事务 (transaction-with-arbitrary-commands.js):

    const [setResult, incrResult] = await client
      .multi()
      .set('key', 'value')
      .incr('counter')
      .exec();
    
  2. 乐观锁 (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 应用

  1. 哈希搜索 (search-hashes.js):

    await client.ft.create('idx', {
      '$.name': { type: 'TEXT' }
    }, { ON: 'HASH' });
    
  2. JSON 搜索 (search-json.js):

    await client.json.set('doc1', '$', { name: 'John', age: 30 });
    await client.ft.search('idx', '@age:[30 40]');
    
  3. 向量搜索 (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', '-', '+');

最佳实践与开发规范

  1. 代码风格

    • 使用 2 空格缩进
    • 统一使用单引号
    • 必须包含分号
    • 使用 async/await 处理异步
  2. 示例设计

    • 每个示例应聚焦单一功能点
    • 包含必要的注释说明
    • 使用有意义的测试数据
    • 考虑错误处理场景
  3. 性能考虑

    • 合理使用管道(pipeline)
    • 批量操作代替单次操作
    • 适当使用连接池

结语

通过本文介绍的各种示例,开发者可以全面掌握 Node Redis 客户端的强大功能。从基础数据结构操作到高级模块集成,从简单的键值存储到复杂的流处理系统,Node Redis 都能提供优雅的解决方案。建议读者结合实际项目需求,选择适合的特性进行深入实践。

node-redis node-redis 项目地址: https://gitcode.com/gh_mirrors/noder/node-redis

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪俊炼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值