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=falseabortConnect=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 canal | Qué es | Cuándo |
|---|---|---|
dinaup.srvs.events.{serie}.moni | Canal 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}.notavailablesystemisstarting | La 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 JSON | En RedisClient | Qué es |
|---|---|---|
Type | EventType | 1, lote de cambios de datos. Es el único tipo que se publica. |
LicSerie | LicenseSerial | La serie de la licencia. |
Timestamp | TimestampUtc | Cuándo publicó el servidor el lote. |
Payload | Changes | Los registros que cambiaron. |
ID | RowId | El registro. |
SectionId | SectionId | La sección, como GUID en texto. |
UserId | UserId | Quién hizo el cambio; vacío si fue el sistema. |
EsUpdate | IsUpdate | true en una edición, false en un alta. |
Nuevos | NewValues | Los valores tras el cambio, por nombre de campo, como texto. |
Anteriores | OldValues | Los 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.