O que é prática recomendada para manuseio de lista e conjunto em Redis?

StackOverflow https://stackoverflow.com/questions/4040574

  •  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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top