TypeScript 的 Redis 客户端:ioredis 和 redis
Redis 是一种高性能的内存数据存储,常用于缓存、会话管理、消息队列和实时应用。在使用 TypeScript 开发时(尤其是在 Node.js 环境中),您需要一个可靠的客户端来与 Redis 交互。目前,两个主要候选库是 redis(Redis 官方库)和 ioredis(流行的第三方替代方案)。两者都原生支持 TypeScript,但在 API、性能和附加功能上有所不同。
1. ioredis 库
ioredis 是一个用 TypeScript 编写的、功能齐全的 Node.js Redis 客户端。由于其可靠性、对集群和 Sentinel 的支持以及内置的数据流处理能力,它被认为是社区中的事实标准。
安装
npm install ioredis# 或yarn add ioredis连接与基本示例
import Redis from 'ioredis';
const redis = new Redis({ host: 'localhost', port: 6379, // password: 'your-password', // 如果需要 retryStrategy: (times) => { // 重连策略 return Math.min(times * 50, 2000); }});
redis.on('connect', () => { console.log('已连接到 Redis');});
redis.on('error', (err) => { console.error('Redis 错误:', err);});
// 使用 async/awaitasync function demo() { await redis.set('user:1', JSON.stringify({ name: '伊万', age: 30 })); const user = await redis.get('user:1'); console.log('获取的数据:', JSON.parse(user));}
demo();ioredis 特性
- 完全支持 TypeScript — 所有方法都有严格的类型定义,使 IDE 能够提示参数和结果的类型。
- 集群和 Sentinel — 内置支持 Redis 集群模式,并在故障时自动切换。
- 流处理 — 为 Redis Streams 提供便捷接口(XADD、XREAD、XGROUP)。
- 频道(Pub/Sub) — 轻松订阅频道并实时接收消息。
- 管道和事务 — 将命令分组以提高性能。
- 自动重连 — 内置重试策略。
管道示例
import Redis from 'ioredis';
const redis = new Redis();
async function pipelineDemo() { const pipeline = redis.pipeline(); pipeline.set('key1', 'value1'); pipeline.set('key2', 'value2'); pipeline.get('key1'); pipeline.get('key2');
const results = await pipeline.exec(); console.log('管道结果:', results); // [ [ null, 'OK' ], [ null, 'OK' ], [ null, 'value1' ], [ null, 'value2' ] ]}
pipelineDemo();2. 官方 redis 库
从 4.x 版本开始,官方 redis 客户端已完全用 TypeScript 重写。它提供了基于 Promise 的现代 API、模块化架构以及与 TypeScript 的深度集成。
安装
npm install redis# 或yarn add redis连接与示例
import { createClient } from 'redis';
const client = createClient({ url: 'redis://localhost:6379' // 或带密码: 'redis://user:password@localhost:6379'});
client.on('error', (err) => console.error('Redis 客户端错误', err));
async function connectAndUse() { await client.connect(); console.log('已连接!');
await client.set('session:123', 'active'); const status = await client.get('session:123'); console.log('会话状态:', status); // 'active'
await client.disconnect();}
connectAndUse();