适用于 TypeScript 的 Redis 客户端:ioredis 和 redis (node-redis)
在现代 Web 应用和微服务世界中,Redis 是最流行的内存数据存储之一。它用于缓存、会话管理、任务队列、Pub/Sub 等众多场景。如果您使用 TypeScript 进行开发,您将需要一个可靠的客户端来与 Redis 交互。在本文中,我们将介绍两个主要选项:ioredis 和 redis(也称为 node-redis)。这两个库都拥有出色的 TypeScript 支持,得到积极维护,并提供了广泛的功能。
为什么需要适用于 TypeScript 的 Redis 客户端?
TypeScript 为 JavaScript 增加了静态类型,使代码更具可预测性,并减少了开发阶段的错误数量。适用于 TypeScript 的 Redis 客户端允许您:
- 使用完全类型支持的 Redis 命令。
- 在 IDE 中使用自动补全功能 (IntelliSense)。
- 轻松集成到现代框架中(NestJS、Express、Koa)。
- 简化错误处理和自动重连。
ioredis 库
ioredis 是一个功能齐全的 Redis 客户端,长期以来一直是 Node.js 生态系统中的事实标准。它支持集群、Pub/Sub、管道(pipelining)、事务(MULTI/EXEC)、自动重连等众多功能。ioredis 使用 TypeScript 编写,并开箱即用地提供类型定义。
安装
npm install ioredisnpm install @types/ioredis # 如果您使用 TypeScript < 4.0连接和基本操作示例
import Redis from 'ioredis';
// 创建到 Redis 的连接(默认 localhost:6379)const redis = new Redis();
// 用于演示的异步函数async function demo() { try { // 设置值 await redis.set('user:1:name', '安娜'); await redis.set('user:1:age', 30);
// 获取值 const name = await redis.get('user:1:name'); console.log('用户名:', name);
// 使用哈希 await redis.hset('user:2', 'name', '伊万', 'age', 25); const user2 = await redis.hgetall('user:2'); console.log('用户 2:', user2);
// 自增 const views = await redis.incr('page:home:views'); console.log('页面浏览量:', views);
// 设置过期时间 (TTL) await redis.setex('temp:code', 60, '123456'); const ttl = await redis.ttl('temp:code'); console.log('键的剩余生存时间:', ttl, '秒');
} catch (error) { console.error('Redis 错误:', error); } finally { // 关闭连接 redis.disconnect(); }}
demo();集群和 Pub/Sub 支持
ioredis 与 Redis 集群配合良好。为此,需要使用专门的 Cluster 类:
import Redis from 'ioredis';
const cluster = new Redis.Cluster([ { host: '127.0.0.1', port: 7000 }, { host: '127.0.0.1', port: 7001 }, { host: '127.0.0.1', port: 7002 }]);
await cluster.set('foo', 'bar');const value = await cluster.get('foo');console.log(value); // 'bar'对于 Pub/Sub,需要使用单独的连接,因为订阅者无法执行常规命令:
import Redis from 'ioredis';
const subscriber = new Redis();const publisher = new Redis();
subscriber.subscribe('news', (err, count) => { console.log(`已订阅 ${count} 个频道`);});
subscriber.on('message', (channel, message) => { console.log(`从频道 ${channel} 收到消息: ${message}`);});
// 发布消息publisher.publish('news', '来自 TypeScript 的问候!');redis 库 (node-redis)
redis(npm 上的 redis 包