Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Conjunto classificado de atualização do Redis na expiração da chave


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.