Skip to content

RedisConnectionFactory

Tổng quan

RedisConnectionFactory là một lớp factory tĩnh tạo kết nối Redis ở chế độ đơn hoặc cluster. Nó trừu tượng hóa sự khác biệt giữa RedisHelper (đơn) và RedisClusterHelper (cluster) sau giao diện chung DefaultRedisHelper từ IGNIS, cho phép mã downstream hoạt động với cả hai chế độ một cách minh bạch.

Thuộc tínhGiá trị
Nguồnpackages/core/src/helpers/redis/redis-connection.factory.ts
Kế thừaBaseHelper (từ @venizia/ignis)
Trả vềDefaultRedisHelper (giao diện chung cho RedisHelperRedisClusterHelper)

API

RedisConnectionFactory.create()

Tạo kết nối Redis dựa trên chế độ được cung cấp.

typescript
static create(opts: TRedisConnectionOptions): DefaultRedisHelper
Tham sốKiểuBắt buộcMô tả
optsTRedisConnectionOptionsTùy chọn kết nối (đơn hoặc cluster)

Trả về: DefaultRedisHelper -- instance RedisHelper hoặc RedisClusterHelper.

Ném lỗi: Nếu chế độ không hợp lệ được cung cấp.

RedisConnectionFactory.parseClusterNodes()

Phân tích chuỗi phân cách bằng dấu phẩy gồm các cặp host:port thành mảng đối tượng node. Dùng để đọc danh sách cluster node từ biến môi trường.

typescript
static parseClusterNodes(opts: { raw: string }): Array<{ host: string; port: number }>
Tham sốKiểuBắt buộcMô tả
opts.rawstringChuỗi phân cách bằng dấu phẩy, ví dụ "node1:6379,node2:6380,node3:6381"

Trả về: Mảng đối tượng { host, port }. Port mặc định là 6379 nếu phân tích thất bại.

Giao diện Kiểu

IRedisConnectionSingleOptions

Tùy chọn để tạo kết nối Redis đơn.

typescript
interface IRedisConnectionSingleOptions {
  mode?: typeof RedisModes.SINGLE;  // 'single' (default when omitted)
  name: string;
  host?: string;        // Default: 'localhost'
  port?: number;        // Default: 6379
  password?: string;
  database?: number;    // Default: 0
  maxRetry?: number;    // Default: 5
  autoConnect?: boolean; // Default: false
}
TrườngKiểuMặc địnhMô tả
mode'single''single'Định danh chế độ kết nối
namestring--Tên kết nối dùng cho ghi log và nhận diện
hoststring'localhost'Hostname server Redis
portnumber6379Port server Redis
passwordstring--Mật khẩu xác thực Redis
databasenumber0Chỉ số cơ sở dữ liệu Redis
maxRetrynumber5Số lần thử kết nối lại tối đa
autoConnectbooleanfalseKết nối ngay khi tạo

IRedisConnectionClusterOptions

Tùy chọn để tạo kết nối Redis cluster.

typescript
interface IRedisConnectionClusterOptions {
  mode: typeof RedisModes.CLUSTER;  // 'cluster' (required)
  name: string;
  nodes: Array<{ host: string; port: number }>;
  password?: string;
}
TrườngKiểuMặc địnhMô tả
mode'cluster'--Phải là 'cluster'
namestring--Tên kết nối dùng cho ghi log và nhận diện
nodesArray<{ host, port }>--Danh sách các seed node của cluster
passwordstring--Mật khẩu xác thực Redis (áp dụng cho tất cả node)

TRedisConnectionOptions

Kiểu union của cả hai giao diện tùy chọn:

typescript
type TRedisConnectionOptions = IRedisConnectionSingleOptions | IRedisConnectionClusterOptions;

Hành vi theo Chế độ

Chế độ Đơn

Tạo instance RedisHelper với các tùy chọn được cung cấp. Đây là mặc định khi mode bị bỏ qua.

typescript
const redis = RedisConnectionFactory.create({
  name: 'my-cache-redis',
  host: 'localhost',
  port: 6379,
  database: 0,
  maxRetry: 5,
});

Nội bộ tạo ra:

typescript
new RedisHelper({
  name: 'my-cache-redis',
  host: 'localhost',
  port: 6379,
  password: undefined,
  database: 0,
  maxRetry: 5,
  autoConnect: false,
});

Chế độ Cluster

Tạo instance RedisClusterHelper với sharded subscribers được bật, kết nối lazy và hỗ trợ offline queue.

typescript
const redis = RedisConnectionFactory.create({
  mode: 'cluster',
  name: 'my-cache-cluster',
  nodes: [
    { host: 'node1', port: 6379 },
    { host: 'node2', port: 6379 },
    { host: 'node3', port: 6379 },
  ],
  password: 'secret',
});

Nội bộ tạo ra:

typescript
new RedisClusterHelper({
  name: 'my-cache-cluster',
  nodes: [
    { host: 'node1', port: 6379 },
    { host: 'node2', port: 6379 },
    { host: 'node3', port: 6379 },
  ],
  clusterOptions: {
    redisOptions: { password: 'secret' },
    shardedSubscribers: true,
    lazyConnect: true,
    enableOfflineQueue: true,
  },
});

Tùy chọn Chế độ Cluster

Tùy chọn ClusterGiá trịMô tả
shardedSubscriberstrueSử dụng sharded pub/sub cho đăng ký cluster Redis 7+
lazyConnecttrueKhông kết nối cho đến khi lệnh đầu tiên được thực thi
enableOfflineQueuetrueXếp hàng lệnh trong khi kết nối đang được thiết lập

Sử dụng trong Các Gói Downstream

Bảy gói sử dụng RedisConnectionFactory để tạo kết nối WebSocket emitter:

Cách Sử dụng Điển hình trong Component

Mẫu được sử dụng bởi ApplicationWebSocketComponent của mỗi gói:

typescript
import { EnvironmentKeys, RedisConnectionFactory, RedisModes } from '@nx/core';
import { applicationEnvironment, WebSocketEmitter } from '@venizia/ignis';

export class ApplicationWebSocketComponent extends BaseComponent {
  override async binding(): Promise<void> {
    const mode =
      applicationEnvironment.get<string>(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_MODE) ??
      RedisModes.SINGLE;

    const redis =
      mode === RedisModes.CLUSTER
        ? this._createClusterRedis()
        : this._createSingleRedis();

    const emitter = new WebSocketEmitter({
      identifier: 'sale-ws-emitter',
      redisConnection: redis,
    });

    this.application.bind({ key: MyBindingKeys.WEBSOCKET_EMITTER }).toValue(emitter);
    this.application.service(MySocketEventService);
  }

  private _createSingleRedis() {
    return RedisConnectionFactory.create({
      mode: 'single',
      name: applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_IDENTIFIER)
        ?? 'my-ws-redis',
      host: applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_HOST)
        ?? 'localhost',
      port: int(applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_PORT))
        ?? 6379,
      password: applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_PASSWORD),
      database: int(applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_DB))
        ?? 0,
      maxRetry: int(applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_MAX_RETRY))
        ?? 5,
    });
  }

  private _createClusterRedis() {
    const clusterNodesStr = applicationEnvironment.get<string>(
      EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_CLUSTER_NODES,
    );

    if (!clusterNodesStr) {
      throw getError({ message: 'Missing cluster nodes env var' });
    }

    return RedisConnectionFactory.create({
      mode: 'cluster',
      name: applicationEnvironment.get(
        EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_CLUSTER_IDENTIFIER,
      ) ?? 'my-ws-redis-cluster',
      nodes: RedisConnectionFactory.parseClusterNodes({ raw: clusterNodesStr }),
      password: applicationEnvironment.get(EnvironmentKeys.APP_ENV_WEBSOCKET_REDIS_PASSWORD),
    });
  }
}

Biến Môi trường

BiếnDùng choVí dụ
APP_ENV_WEBSOCKET_REDIS_MODEChọn chế độ đơn hoặc clustersingle
APP_ENV_WEBSOCKET_REDIS_HOSTHostname chế độ đơnlocalhost
APP_ENV_WEBSOCKET_REDIS_PORTPort chế độ đơn6379
APP_ENV_WEBSOCKET_REDIS_PASSWORDXác thực (cả hai chế độ)secret
APP_ENV_WEBSOCKET_REDIS_DBChỉ số database chế độ đơn0
APP_ENV_WEBSOCKET_REDIS_MAX_RETRYSố lần thử lại chế độ đơn5
APP_ENV_WEBSOCKET_REDIS_CLUSTER_NODESDanh sách node chế độ clusternode1:6379,node2:6379

Tài liệu Liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.