Node.js 指南
将 Node.js 应用程序连接到 Redis 数据库
安装 Redis 和 Redis 客户端,然后将 Node.js 应用程序连接到 Redis 数据库。
node-redis
node-redis 是适用于 Node.js 的现代、高性能 Redis 客户端。node-redis
需要运行 Redis 或 Redis Stack 服务器。有关 Redis 安装说明,请参阅 快速入门。
安装
要安装 node-redis,请运行
npm install redis
连接
连接到端口 6379 上的本地主机。
import { createClient } from 'redis';
const client = createClient();
client.on('error', err => console.log('Redis Client Error', err));
await client.connect();
存储和检索一个简单的字符串。
await client.set('key', 'value');
const value = await client.get('key');
存储和检索一个映射。
await client.hSet('user-session:123', {
name: 'John',
surname: 'Smith',
company: 'Redis',
age: 29
})
let userSession = await client.hGetAll('user-session:123');
console.log(JSON.stringify(userSession, null, 2));
/*
{
"surname": "Smith",
"name": "John",
"company": "Redis",
"age": "29"
}
*/
要连接到不同的主机或端口,请使用格式为 redis[s]://[[username][:password]@][host][:port][/db-number]
的连接字符串
createClient({
url: 'redis://alice:foobared@awesome.redis.server:6380'
});
要检查客户端是否已连接并准备发送命令,请使用 client.isReady
,它会返回一个布尔值。client.isOpen
也可用。当客户端的基础套接字处于打开状态时,它会返回 true
,当它处于关闭状态时,它会返回 false
(例如,当客户端在网络错误后仍处于连接或重新连接状态时)。
连接到 Redis 集群
要连接到 Redis 集群,请使用 createCluster
。
import { createCluster } from 'redis';
const cluster = createCluster({
rootNodes: [
{
url: 'redis://127.0.0.1:16379'
},
{
url: 'redis://127.0.0.1:16380'
},
// ...
]
});
cluster.on('error', (err) => console.log('Redis Cluster Error', err));
await cluster.connect();
await cluster.set('foo', 'bar');
const value = await cluster.get('foo');
console.log(value); // returns 'bar'
await cluster.quit();
使用 TLS 连接到生产 Redis
在部署应用程序时,请使用 TLS 并遵循 Redis 安全 指南。
const client = createClient({
username: 'default', // use your Redis user. More info https://redis.ac.cn/docs/management/security/acl/
password: 'secret', // use your password here
socket: {
host: 'my-redis.cloud.redislabs.com',
port: 6379,
tls: true,
key: readFileSync('./redis_user_private.key'),
cert: readFileSync('./redis_user.crt'),
ca: [readFileSync('./redis_ca.pem')]
}
});
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();
await client.set('foo', 'bar');
const value = await client.get('foo');
console.log(value) // returns 'bar'
await client.disconnect();
您还可以使用离散参数和 UNIX 套接字。详情可在 客户端配置指南 中找到。
生产使用
处理错误
Node-Redis 提供 多个事件来处理各种场景,其中最关键的是 error
事件。
每当客户端内发生错误时,就会触发此事件。
监听错误事件至关重要。
如果客户端未注册至少一个错误监听器且发生错误,则系统将抛出该错误,可能导致 Node.js 进程意外退出。有关更多详细信息,请参阅 EventEmitter 文档。
const client = createClient({
// ... client options
});
// Always ensure there's a listener for errors in the client to prevent process crashes due to unhandled errors
client.on('error', error => {
console.error(`Redis client error:`, error);
});
处理重新连接
如果网络问题或其他问题意外关闭套接字,客户端将拒绝所有已发送的命令,因为服务器可能已执行这些命令。其余待处理的命令将保持在内存中排队,直到建立新的套接字。此行为由 enableOfflineQueue
选项控制,该选项默认启用。
客户端使用 reconnectStrategy
来决定何时尝试重新连接。默认策略是根据尝试次数 Math.min(retries * 50, 500)
计算每次尝试前的延迟。您可以通过将受支持的值传递给 reconnectStrategy
选项来自定义此策略
- 定义回调
(retries: number, cause: Error) => false | number | Error
(推荐)
const client = createClient({
socket: {
reconnectStrategy: function(retries) {
if (retries > 20) {
console.log("Too many attempts to reconnect. Redis connection was terminated");
return new Error("Too many retries.");
} else {
return retries * 500;
}
}
}
});
client.on('error', error => console.error('Redis client error:', error));
在提供的重新连接策略回调中,客户端尝试重新连接最多 20 次,每次尝试之间的延迟为 重试次数 * 500
毫秒。大约两分钟后,如果超过最大重试次数限制,客户端会记录一条错误消息并终止连接。
- 使用数值设置以毫秒为单位的固定延迟。
- 使用
false
禁用重新连接尝试。此选项仅应用于测试目的。
超时
要为连接设置超时,请使用 connectTimeout
选项
const client = createClient({
// setting a 10-second timeout
connectTimeout: 10000 // in milliseconds
});
client.on('error', error => console.error('Redis client error:', error));