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 选项来自定义此策略

  1. 定义回调 (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 毫秒。大约两分钟后,如果超过最大重试次数限制,客户端会记录一条错误消息并终止连接。

  1. 使用数值设置以毫秒为单位的固定延迟。
  2. 使用 false 禁用重新连接尝试。此选项仅应用于测试目的。

超时

要为连接设置超时,请使用 connectTimeout 选项

const client = createClient({
  // setting a 10-second timeout  
  connectTimeout: 10000 // in milliseconds
});
client.on('error', error => console.error('Redis client error:', error));

了解更多

给此页面评分