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

Conjunto ordenado de actualizaciones de Redis al expirar la clave

Tiene razón, no puede "poner una caducidad" en el valor del conjunto ordenado.

Pero puede trabajar con la clave principal y capturar el evento cuando se produzca el vencimiento. Tienes al menos 2 formas de lograr esto:

  • Uso de la notificación de espacio clave
  • Uso de Redis Gears

Notificación de espacio clave

Con la Notificación de espacio clave, puede capturar el evento EXPIRE que enviará un mensaje PUBLICAR que luego podrá consumir.

Déjame explicarte el flujo básico:

Configurar notificaciones

CONFIG SET notify-keyspace-events Ex
  • M :eventos que suceden en las teclas
  • x :capturar eventos caducados

Ahora su base de datos publicará un evento en __key*__:* canal.

Entonces puede crear un servicio que escuche estos eventos y actualice el conjunto (directa o indirectamente):

psubscribe __key*__:*

Si tiene una aplicación que establece el siguiente valor y vencimiento

set foo bar EX 5

Deberías recibir el siguiente mensaje

1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"

Engranajes de Redis

Con Redis Gears, captura el mismo evento (también se basa en la notificación), pero es más fácil escribir código directamente en su base de datos de Redis.

Puede crear un Gears de la siguiente manera:(este es un script de Python, estoy usando RedisInsight para implementarlo en Redis)

def process(x):
    execute('LPUSH', 'expired:keys', x['value']['key']);

# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
            execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
             mode='sync',
             eventTypes=['expired'],
             readValue=False)

# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
              batch=100,
              duration=1, 
              trimStream = False)

Mire la sección iniciada por cap = GB('KeysReader')

  • Esto escuchará cualquier caducidad de clave prefix='*' &eventTypes=['expired']
  • En caso de vencimiento, agregará un mensaje a los 'expired:events' Redis Stream usando el comando XADD
  • Luego mira la función proc = GB('StreamReader') que procesará los flujos
  • cada vez que hay un nuevo mensaje en el flujo, llamará al process() función.

Puede agregar su lógica para actualizar el conjunto ordenado en esta función. En mi ejemplo, acabo de agregar la clave caducada a una lista.

Déjame desviarme un poco de tu pregunta inicial.

Parece que está utilizando el conjunto ordenado para crear algún tipo de indexación para sus datos.

Si este es el caso, debe buscar en RediSearch, otro módulo de Redis que le permite indexar Hash campos y luego use el índice para realizar algunas consultas avanzadas y agregaciones.

Con RediSearch no necesita agregar ningún código para administrar el índice, la base de datos lo hace automáticamente y puede consultar los campos.

Te invito a mirar:

  • El módulo RediSearch
  • Primeros pasos de RediSearch

Lo siento si esta no es la razón por la que está utilizando el conjunto ordenado, pero creo que vale la pena comprobarlo, ya que podría simplificar mucho el código de su aplicación si administra el índice manualmente hoy.