O que é prática recomendada para manuseio de lista e conjunto em Redis?
-
27-09-2019 - |
Pergunta
Estamos usando o Redis como servidor de cache e geralmente precisamos lidar com a lista de cache. Quando cache objetos simples, fazemos um Get e Redis retornará nulo se o objeto não existir e saberemos que o objeto não é armazenado em cache e precisará ser carregado no banco de dados.
Mas como lidamos melhor com as listas - uma lista vazia pode ser um valor válido. Precisamos ligar para a existência de verificar se a lista existe (mas fazendo a operação 2 chamadas em vez de uma) ou alguém tem uma idéia melhor de como lidar com esse cenário?
/Obrigado
Solução
Se você absolutamente precisar fazer isso, quando a lista for criada, poderá pressionar um "sentinela" como o primeiro elemento que nunca é removido. Para fazer isso atomicamente, você pode usar o Multi/Exec/Watch, mas o relógio está disponível apenas no Redis 2.2 que atualmente é uma visualização (mesmo que seja bastante estável, você pode pegá -lo na filial do GitHub Master).
Eu acho que, no seu caso de uso, você também pode querer rpushx e lpushx, que pressionará atomicamente uma lista apenas se já existir.
Observe que, como o Redis 2.2 existe significa ter pelo menos 1 elemento para uma lista, pois as listas que atingirão zero elementos são removidas automaticamente, por muitos bons motivos;)
Outras dicas
Infelizmente, os comandos de recuperação de listar/definir, como LRange e Smembers, não parecem distinguir entre uma lista/conjunto vazio e uma lista/conjunto inexistente.
Portanto, se você absolutamente precisar distinguir entre os dois casos, acho que precisará fazer um existe primeiro. Experimente os seus comandos para um melhor desempenho. A maioria das bibliotecas de clientes Redis suporta pipelining.
Ou você pode reconsiderar sua estratégia de cache para não precisar distingui -los.
Se você estiver usando o PHP, eu atribuiria o valor de retorno a uma variável e verifique se é uma matriz. (É assim que funciona usando a biblioteca Predis)
$res = $redis->get('Key');
if(is_array($res))
do code here