Você está correto, você não pode "colocar uma expiração" no próprio valor do conjunto classificado.
Mas você pode trabalhar com a chave principal e capturar o evento quando ocorrer a expiração. Você tem pelo menos 2 maneiras de conseguir isso:
- Usando a notificação de espaço de chave
- Usando o Redis Gears
Notificação de espaço de chave
Usando o Key Space Notification, você pode capturar o evento EXPIRE que enviará uma mensagem PUBLISH que você poderá consumir.
Deixe-me explicar o fluxo básico:
Configurar notificações
CONFIG SET notify-keyspace-events Ex
- E :eventos que acontecem nas teclas
- x :capturar eventos expirados
Agora seu banco de dados publicará um evento no
__key*__:*
canal. Então você pode construir um serviço que escute esses eventos atualize o conjunto (direta ou indiretamente):
psubscribe __key*__:*
Se você tiver um aplicativo que defina o seguinte valor e validade
set foo bar EX 5
Você deve receber a seguinte mensagem
1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"
Redis Gears
Usando Redis Gears, você captura o mesmo evento (também é baseado em notificação), mas é mais fácil escrever código diretamente em seu banco de dados Redis.
Você pode criar um Gears da seguinte forma:(este é um script Python, estou usando o RedisInsight para implantá-lo no 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)
Veja a seção iniciada por
cap = GB('KeysReader')
- Isso escutará qualquer expiração de chave
prefix='*'
&eventTypes=['expired']
- Em caso de expiração, ele adicionará uma mensagem ao
'expired:events'
Redis Stream usando o comando XADD - Em seguida, observe a função
proc = GB('StreamReader')
que processará os fluxos - cada vez que uma nova mensagem estiver no fluxo, ela chamará o
process()
função.
Você pode adicionar sua lógica para atualizar o conjunto classificado nesta função. No meu exemplo, acabei de adicionar a chave expirada a uma lista.
Deixe-me divergir um pouco da sua pergunta inicial.
Parece que você está usando Sorted Set para criar alguma forma de indexação para seus dados.
Se for esse o caso, você deve consultar o RediSearch, outro módulo Redis que permite indexar Hash campos e, em seguida, use o índice para fazer algumas consultas e agregações avançadas.
Com o RediSearch você não precisa adicionar nenhum código para gerenciar o índice, isso é feito automaticamente pelo banco de dados, e você pode consultar os campos.
Convido você a ver:
- O módulo RediSearch
- Primeiros passos do RediSearch
Desculpe se este não é o motivo pelo qual você está usando o Sorted Set, mas acho que vale a pena verificar, pois assim poderia simplificar muito o código do seu aplicativo se você gerenciar o índice manualmente hoje.