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.