Eventos Redis

Cómo publica el servidor de Dinaup cada alta y edición en tu Redis: la conexión, el canal, el formato del evento, las marcas de cambio por sección y la lectura con RedisClient del SDK.

Dinaup publica al momento en tu Redis cada alta y edición de tus datos, con los valores nuevos y los anteriores. Es el mismo aviso que un webhook saliente, con más caudal y sin configurar nada por sección.

Antes de empezar

  • Un servidor Redis tuyo al que llegue el servidor de Dinaup.
  • La serie de tu licencia: nombra el canal y las claves.
  • Para leerlo desde .NET, el paquete Dinaup (Dinaup.Redis.RedisClient). Desde otro lenguaje, un cliente Redis con pub/sub y gzip.

Conectar tu Redis

El servidor lee la cadena de conexión del campo ConexionRedisEventos (pr_15020822_13532944) del registro de tu empresa principal en la sección Empresas administradas. Formato StackExchange.Redis:

tu-redis.tuempresa.com:6379,password=xxxx,abortConnect=false

abortConnect=false es obligatorio: sin él no se conecta. Un cambio en el campo se aplica solo, sin reiniciar nada; vaciarlo desconecta. Si tu Redis no responde, Dinaup reintenta con una espera que va de 15 segundos a 5 minutos.

Lo que publica el servidor

Clave o canalQué esCuándo
dinaup.srvs.events.{serie}.moniCanal pub/sub con los lotes de cambios, en JSON comprimido con gzip.En cada reparto de cambios.
dinaup.srvs.kv.{serie}.seccion.{seccion}La última fecha en que cambió algo de esa sección, en ISO 8601 UTC.En cada cambio.
dinaup.srvs.kv.{serie}.seccion.{seccion}.{campo}La última fecha en que cambió ese campo de esa sección.En cada cambio.
dinaup.srvs.status.{serie}El estado del servidor: operativo o deteniéndose.Cada 100 segundos.
dinaup.srvs.kv.{serie}.notavailablesystemisstartingLa fecha hasta la que el servidor sigue arrancando. Vacía al terminar.Mientras arranca.

Las marcas de sección no caducan. Una marca que no cambia no distingue entre "nada ha cambiado" y "el servidor no ha publicado".

Leer los eventos con el SDK

RedisClient abre la conexión, se suscribe al canal y entrega cada lote descomprimido y deserializado. ChangesReceived corre en un hilo de Redis.

using Dinaup.Redis;

using var redis = new RedisClient("tu-redis.tuempresa.com:6379,password=xxxx,abortConnect=false", "<serie>");

redis.ChangesReceived += lote =>
{
    foreach (var cambio in lote.Changes)
    {
        // cambio.SectionId, cambio.RowId, cambio.IsUpdate, cambio.NewValues, cambio.OldValues
    }
};

redis.MessageFailed += ex => Console.WriteLine(ex.Message);

if (await redis.SubscribeToChangesAsync() == false)
{
    // sin conexión: la cadena está vacía o Redis no responde
}

UnsubscribeFromChanges() para la escucha; Dispose() la para y cierra la conexión. Si la cadena no lleva abortConnect=false, RedisClient lo añade.

Sin escuchar el canal, la marca de la sección dice si hace falta volver a pedir un informe:

if (await redis.MayHaveChangesAsync(sectionId, ultimaLecturaUtc))
{
    // vuelve a consultar la API
}

Un false es seguro: hay marca y es anterior a tu fecha. Un true puede ser una falsa alarma, y es también lo que recibes cuando Redis no se puede leer. GetLastChangeAsync(sectionId, campo) devuelve la marca en sí. GetServerStatusAsync() e IsStartingAsync() leen la instantánea y el arranque.

El evento

Cada mensaje del canal es un lote. Descomprimido, es este JSON:

{
  "Type": 1,
  "LicSerie": "<serie>",
  "Timestamp": "2026-09-05T10:00:00Z",
  "Payload": [
    {
      "ID": "123e4567-e89b-12d3-a456-426614174000",
      "SectionId": "0f5d1c2a-...",
      "UserId": "9a1b...",
      "EsUpdate": true,
      "Nuevos": { "pr_importe": "150.00" },
      "Anteriores": { "pr_importe": "100.00" }
    }
  ]
}
Propiedad en el JSONEn RedisClientQué es
TypeEventType1, lote de cambios de datos. Es el único tipo que se publica.
LicSerieLicenseSerialLa serie de la licencia.
TimestampTimestampUtcCuándo publicó el servidor el lote.
PayloadChangesLos registros que cambiaron.
IDRowIdEl registro.
SectionIdSectionIdLa sección, como GUID en texto.
UserIdUserIdQuién hizo el cambio; vacío si fue el sistema.
EsUpdateIsUpdatetrue en una edición, false en un alta.
NuevosNewValuesLos valores tras el cambio, por nombre de campo, como texto.
AnterioresOldValuesLos valores anteriores. null en un alta.

Desde otro lenguaje: suscríbete al canal, descomprime cada mensaje con gzip y deserializa ese JSON. Si no conoces la serie, suscríbete por patrón a dinaup.srvs.events.*.moni: el nombre del canal que recibes la contiene.

Qué no se publica

Quedan fuera las plantillas base y las tablas de líneas como tales, y varias secciones, entre ellas:

  • Códigos de inicio de sesión.
  • Uso API, Registros de Actividad API y Registro de Errores API.
  • Anotaciones internas, registros de eliminación, historiales de actividad en registros y en informes, personalización de columnas.
  • Numeraciones y series.

Un lote perdido no se reenvía

Lo publicado mientras tu suscriptor estaba desconectado no vuelve. Para reconstruir estado, consulta la API o PG Sync.

En esta página