Saltar a contenido

Documentación: Nodo Memory Check

Descripción General

El nodo Memory Check comprueba si una clave existe en Redis y, en caso afirmativo, obtiene su valor y TTL (tiempo restante de vida). A diferencia de Memory Get, este nodo no falla cuando la clave no existe: utiliza conectores condicionales para bifurcar el flujo según el resultado.

Tipo de nodo: memory_check
Clase: action
Paquete: pkg/automationnode/memorynodes

¿Cuándo usar este nodo?

Use este nodo cuando necesite:

  • Comprobar si una clave existe antes de leer (evitar errores cuando la clave puede no existir)
  • Implementar lógica de caché condicional: si el valor existe, usarlo; si no, calcularlo y guardarlo con Memory Set
  • Usar el campo ttl para saber cuánto tiempo queda hasta que expire la clave
  • Ramificar el flujo según si un valor está en memoria

Configuración del Nodo

Formulario de configuración del nodo Memory Check

El nodo requiere un único parámetro de entrada: la clave a consultar en Redis. Puede configurarlo en la vista Form o en el JSON Editor.

Estructura JSON (Parámetros de entrada)

{
  "key": "key-name"
}

Campos Requeridos

Campo Tipo Descripción
key string La clave a consultar en Redis

La clave puede definirse mediante el sistema de templates del motor, por ejemplo: {{nodo_anterior.output_field}}.

Ejemplo de configuración

{
  "key": "mi_variable_cache"
}

Salidas (Output)

El contenido del output depende de si la clave existe o no:

Cuando la clave existe (conector in_memory)

Campo Tipo Descripción
value string El valor almacenado en Redis para la clave
ttl string Tiempo restante de vida en segundos ("-1" si no expira)

Cuando la clave no existe (conector not_in_memory)

El output es un objeto vacío (sin value ni ttl).

Ejemplo de salida (clave existente)

{
  "value": "contenido_almacenado",
  "ttl": "3600"
}

Puede referenciar esta salida en nodos posteriores mediante expresiones de template, por ejemplo {{memory_check.value}}.

Conectores (Connectors)

Conector Descripción
in_memory La clave existe en Redis; el output incluye value y ttl
not_in_memory La clave no existe, o hubo un error al consultar Redis

Estos conectores permiten ramificar el flujo: por ejemplo, conectar in_memory a un nodo que use el valor, y not_in_memory a uno que lo almacene o realice otra acción alternativa.

Validación

  • key debe ser un string no vacío.
  • Si key no es un string o está vacío, la validación falla y el nodo no se ejecuta.

Dependencias

  • Redis: El nodo utiliza redis_singleton.GetRedisProducer(). Se requiere configuración de Redis en las variables de entorno (REDIS_URL, REDIS_PASSWORD).

Comportamiento ante errores

Si ocurre un error al consultar Redis (por ejemplo, conexión fallida):

  • El nodo retorna el error al motor.
  • El output contiene: value: "", exists: false, ttl: "0".
  • El conector emitido es not_in_memory.

El GetFallbackConnector es continue, aunque en la implementación actual los errores se manejan emitiendo not_in_memory en el resultado.

Nodos relacionados

Nodo Descripción
Memory Set (memory_set) Almacena un valor en Redis con clave, valor y TTL opcional
Memory Get (memory_get) Recupera un valor; falla si la clave no existe

Uso típico

  1. Comprobar antes de leer: Evitar errores cuando la clave puede no existir. En lugar de usar Memory Get directamente, usar Memory Check y ramificar según in_memory / not_in_memory.
  2. Caché condicional: Verificar si un valor está en caché; si existe, usarlo; si no, calcularlo y guardarlo con Memory Set.
  3. Lógica de expiración: Usar el campo ttl para saber cuánto tiempo queda hasta que expire la clave.

Flujo de ejemplo

[Trigger] → [Memory Check (key: "session_data")]
                ├─ in_memory     → [Usar valor en siguiente nodo]
                └─ not_in_memory → [Memory Set] → [Continuar flujo]

Ejemplo con lógica adicional

[Memory Check] ─in_memory──→ [Nodo A: usar value]
[Memory Check] ─not_in_memory─→ [Memory Set] → [Nodo B: valor recién guardado]

Estructura interna (Referencia para desarrolladores)

El nodo se registra en pkg/nodelinker/node_linker.go:

"memory_check": memorynodes.NewMemoryCheckAutomationNode,
type MemoryCheckNode struct {
    Key string
}

type MemoryCheckAutomationNode struct {
    automation.AutomationNode
    MemoryCheckNode MemoryCheckNode
    logger          *zap.SugaredLogger
}