连接到服务器

将您的 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);
});
评价此页面
回到顶部 ↑