适用于 Node.js 的 Redis 客户端:ioredis
Redis 是一种高性能的内存数据存储,常被用作数据库、缓存和消息代理。在 Node.js 中与 Redis 交互有多种库可选,其中功能最强大且最流行的之一就是 ioredis。该库提供了完整、高效且便捷的 API 用于操作 Redis,支持所有现代特性,包括集群、发布/订阅、事务和 Lua 脚本。
本文将详细介绍 ioredis,包括其安装、主要功能,并提供基于 JavaScript (Node.js) 的实用代码示例。
安装与连接
通过 npm 或 yarn 安装 ioredis 非常简单:
npm install ioredis# 或yarn add ioredis安装后,创建一个客户端实例:
const Redis = require('ioredis');const redis = new Redis(); // 默认连接 localhost:6379
// 或使用显式参数const redis = new Redis({ host: 'localhost', port: 6379, password: 'your_password', // 如果设置了密码 db: 0});该库支持 Promise 和 async/await,使代码更简洁易读。
基本数据操作
ioredis 支持所有标准 Redis 命令。以下是对字符串、列表和哈希的操作示例。
字符串操作
async function stringExample() { await redis.set('user:1:name', '阿列克谢'); const name = await redis.get('user:1:name'); console.log(name); // 阿列克谢
// 设置带过期时间 (TTL) await redis.setex('temp:code', 60, '123456'); // 存活 60 秒}列表操作
async function listExample() { await redis.lpush('queue:tasks', 'task1', 'task2'); await redis.rpush('queue:tasks', 'task3'); const tasks = await redis.lrange('queue:tasks', 0, -1); console.log(tasks); // ['task2', 'task1', 'task3']}哈希操作
async function hashExample() { await redis.hset('user:1', { name: '玛丽亚', age: 28, city: '莫斯科' }); const age = await redis.hget('user:1', 'age'); console.log(age); // 28
const allData = await redis.hgetall('user:1'); console.log(allData); // { name: '玛丽亚', age: '28', city: '莫斯科' }}发布/订阅 (Pub/Sub)
Redis 支持发布/订阅模式,ioredis 提供了便捷的接口。注意:订阅者需要使用独立的连接。
// 订阅者const subscriber = new Redis();subscriber.subscribe('news', 'updates', (err, count) => { console.log(`已订阅 ${count} 个频道`);});
subscriber.on('message', (channel, message) => { console.log(`从 ${channel} 收到: ${message}`);});
// 发布者(可在另一个进程中)const publisher = new Redis();publisher.publish('news', '你好,世界!');publisher.publish('updates', '版本 2.0 已发布');Redis 集群操作
ioredis 对集群有出色的支持。只需传入集群节点列表即可:
const cluster = new Redis.Cluster([ { host: 'node1.example.com', port: 6379 }, { host: 'node2.example.com', port: 6379 }, { host: 'node3.example.com', port: 6379 }]);
async function clusterExample() { await cluster.set('key', 'value'); const val = await cluster.get('key'); console.log(val); // value}该库会自动处理节点间的命令重定向(MOVED、ASK)并支持槽位管理。
事务与管道
如需原子性地执行多条命令,请使用事务 (MULTI/EXEC)。如需提升性能,请使用管道 (pipeline)。
事务
async function transaction