连接到服务器
将您的 Node.js 应用程序连接到 Redis 数据库
基本连接
连接到 localhost 的 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:[email protected]: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/latest/operate/oss_and_stack/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
不会自动尝试重新连接。但是,您可以在配置中设置 socket.reconnectionStrategy
字段来决定是否尝试重新连接以及如何进行。为 socket.reconnectionStrategy
选择以下值之一
false
:(默认)不尝试重新连接。number
:等待此毫秒数,然后尝试重新连接。<function>
:使用自定义函数来决定如何处理重新连接。
自定义函数具有以下签名
(retries: number, cause: Error) => false | number | Error
它在每次尝试重新连接之前被调用,其中 retries
表示目前已尝试的次数。cause
参数是一个 Error
对象,其中包含连接丢失原因的信息。函数的返回值可以是以下任意一种
false
:不尝试重新连接。number
:等待此毫秒数,然后再次尝试。Error
:与false
相同,但允许您提供关于为何未尝试重新连接的额外信息。
下面的示例展示了一个 reconnectionStrategy
函数,它实现了一个自定义的指数退避策略
createClient({
socket: {
reconnectStrategy: retries => {
// Generate a random jitter between 0 – 200 ms:
const jitter = Math.floor(Math.random() * 200);
// Delay is an exponential back off, (times^2) * 50 ms, with a
// maximum value of 2000 ms:
const delay = Math.min(Math.pow(2, retries) * 50, 2000);
return delay + jitter;
}
}
});
连接事件
客户端对象发出以下与连接相关的事件
connect
:(无参数)客户端即将开始连接到服务器。ready
:(无参数)客户端已连接并准备就绪可使用。end
:(无参数)客户端已通过client.quit()
有意关闭。error
:发生错误,由Error
参数描述。这通常是网络问题,例如“Socket closed unexpectedly”(套接字意外关闭)。reconnecting
:(无参数)客户端因错误导致连接丢失后即将尝试重新连接。
使用如下代码响应这些事件
client.on('error', error => {
console.error(`Redis client error:`, error);
});