sql >> Base de Datos >  >> NoSQL >> Redis

Canalización frente a procesamiento por lotes en Stackexchange.Redis

Detrás de escena, SE.Redis hace bastante trabajo para tratar de evitar la fragmentación de paquetes, por lo que no es sorprendente que sea bastante similar en su caso. Las principales diferencias entre procesamiento por lotes y canalización plana son:

  • un lote nunca se intercalará con operaciones competidoras en el mismo multiplexor (aunque puede estar intercalado en el servidor; para evitar eso, debe usar un multi /exec transacción o un script Lua)
  • un lote siempre evitará la posibilidad de paquetes de tamaño insuficiente, porque conoce todos los datos con anticipación
  • pero al mismo tiempo, el lote completo debe completarse antes de que se pueda enviar algo, por lo que esto requiere más almacenamiento en memoria intermedia y puede introducir latencia artificialmente

En la mayoría de los casos, lo hará mejor si evita el procesamiento por lotes, ya que SE.Redis logra la mayor parte de lo que hace automáticamente. simplemente agregando trabajo.

Como nota final; si desea evitar la sobrecarga local, un enfoque final podría ser:

redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
    row.Field<int>("Value"), flags: CommandFlags.FireAndForget);

Esto envía todo por el cable, sin esperar respuestas ni asignar Task incompletos s para representar valores futuros. Es posible que desee hacer algo como Ping al final sin dispara y olvida, para verificar que el servidor todavía te está hablando. Tenga en cuenta que el uso de disparar y olvidar significa que no notará ningún error del servidor que se informe.