node ioredis node.js redis

node.js - ioredis - ¿Debo compartir la conexión Redis entre archivos/módulos?



redis windows (2)

Tanto Node como Redis pueden manejar muchas conexiones bastante bien, así que eso no es un problema.

En su situación, está creando conexiones Redis al inicio de su aplicación, por lo que la cantidad de conexiones que está configurando es limitada (en el sentido de que una vez que se inicia la aplicación, la cantidad de conexiones será constante).

Las situaciones en las que desea reutilizar la misma conexión se encuentran en situaciones altamente dinámicas, por ejemplo, con un servidor HTTP donde necesita consultar Redis para cada solicitud. Crear una nueva conexión para cada solicitud sería un desperdicio de recursos (crear y destruir conexiones todo el tiempo) y reutilizar una conexión para cada solicitud sería preferible.

En cuanto a cuál de los dos escenarios preferiría, me estoy inclinando hacia el Escenario A por mi cuenta.

Estoy desarrollando una aplicación node.js y necesito un uso intensivo de Redis. La aplicación se lanzará en cluster través de 8 núcleos de CPU.

En este momento tengo 100 conexiones simultáneas a Redis porque cada trabajador por CPU tiene varios módulos en ejecución require(''redis'').createClient() .

Escenario A:

archivo1.js:

var redis = require(''redis'').createClient();

file2.js

var redis = require(''redis'').createClient();

ESCENARIO B:

redis.js

var redis = require(''redis'').createClient(); module.exports = redis;

file1.js

var redis = require(''./redis'');

file2.js

var redis = require(''./redis'');

Qué enfoque es mejor: crear una nueva instancia de Redis en cada archivo nuevo que presento (escenario A) o crear una conexión de Redis globalmente (escenario B) y compartir esta conexión en todos los módulos que tengo. ¿Cuáles son los inconvenientes / beneficios de cada solución?

¡Gracias por adelantado!


Cuando me enfrento a una pregunta como esta, generalmente pienso en tres preguntas básicas.

  1. ¿Cuál es más legible?
  2. ¿Qué permite una mejor reutilización del código?
  3. ¿Cuál es más eficiente?

No necesariamente en este orden, ya que depende del escenario, pero creo que en este caso las tres preguntas están a favor de la opción B. Si alguna vez necesitas modificar las opciones de createClient, necesitarás editarlas en cada archivo que lo usa. Que en la opción A es cada archivo que usa redis, y la opción B es simplemente redis.js. Además, si aparece un producto nuevo o más nuevo y desea reemplazar el redis, sería posible hacer que redis.js sea un contenedor para un paquete diferente o incluso un cliente redis más nuevo, reduciendo sustancialmente el tiempo de conversión.

Los globales generalmente son algo malo, pero en este ejemplo, redis.js no debe almacenar el estado mutable, por lo que no hay problema para tener un singleton global en este contexto.