Gostaria de definir atomicamente todos os valores de uma lista, assim como o SET
comando normal.
Eu preciso disso porque a lista será uma representação em cache de uma consulta ao banco de dados. Gostaria de acessar o cache no modo "paginado" usando LRANGE
.
Pensei em usar RPUSH , mas se ocorrer uma condição de corrida, meu cache conterá vários conjuntos de resultados duplicados, um após o outro, e eu não gostaria disso.
Usar RPUSH
em conjunto com LTRIM o comprimento de lista conhecido deve funcionar na maioria das vezes, mas pode falhar nos casos em que a fonte de dados retornou conjuntos de resultados diferentes e tivemos uma condição de corrida ativada LTRIM
. É claro que é muito menos provável que isso aconteça, mas ainda assim.
O SORTED SET
uso de índices como pesos sofre de problemas semelhantes.
Usar as transações do Redis parece um exagero: no que me diz respeito, eles interrompem todos os outros comandos recebidos até que a transação termine - e o conjunto de resultados em cache pode ser robusto.
No entanto, DEL
e RPUSH
numa transação parece ser a única opção até agora. É realmente?
A resposta curta é que parece que uma transação geralmente seria a maneira mais fácil de lidar com isso:
No entanto, se sua lista for enorme e você estiver preocupado em bloquear o servidor Redis enquanto ele está sendo preenchido, sua outra opção seria usar um padrão de bloqueio distribuído como redlock para bloquear a chave de leituras/ gravações enquanto você preenche a lista.
Sim, acho que descobri. Deveria ser um script LUA, já que são atômicos:
Ainda não testei, mas deve funcionar. Primeiro excluímos o array e depois definimos todos os seus valores.
LPUSH e RPUSH são variados, então você pode simplesmente chamar qualquer um deles com todos os valores que deseja adicionar.
Isso acontecerá atomicamente.