Redis Setnx

Redis Setnx

Redis String Data Type

Redis é um armazenamento de dados na memória que suporta estruturas de dados mais complexas quando comparadas a outros lojas de dados de valor-chave. Entre todas essas estruturas de dados complexas, como conjuntos, hashes, bitmaps e listas, ele suporta os tipos de string mais descomplicados também. Nesse caso, uma chave de string mapeia para um valor de string. Geralmente, os comandos definidos e obtidos são usados ​​para criar e buscar dados de valor-chave da loja Redis. Além disso, o comando set cria uma nova chave na memória e mapeia um valor de string, nada além disso. Ele substituirá o valor se a chave já existir.

Nenhum mecanismo de segurança é implementado com o comando definido por padrão para lidar com as mutações do valor por vários clientes simultaneamente sem concordância mútua. Este comando deve ser chamado com medições de segurança em vigor, como um mecanismo de travamento.

Definindo um valor de chave condicionalmente

É sempre melhor seguir uma medida de segurança ao mudar um valor que é armazenado em uma determinada chave. Portanto, Redis introduziu uma opção para o comando set Nx Isso está em vigor e não vai mudar o valor de uma chave já existente. O mesmo comportamento foi implementado com um novo comando que é explicado na próxima seção.

O comando setnx

O comando setnx, como o próprio nome sugere, “Definir se não existir ”” O que significa que o comando definirá apenas um valor se e somente se a chave especificada não existir no armazenamento de dados. Sempre que a chave especificada já existe, o comando não executará nenhuma operação nessa chave. Com essa restrição, o comando setnx é mais seguro do que o comando set. Além disso, esse comando tem complexidade de tempo constante.

Sintaxe:

Valor setnx redis_key

Redis_key: O identificador exclusivo de uma entrada de par de valores-chave Redis.

valor: O valor associado à chave Redis.

Este comando retornará uma resposta inteira, onde a chave 1 significa que foi definida com um novo valor. Se o valor retornado for 0, a chave não será definida e a chave existente manterá o valor antigo.

Exemplo 01 - Mecanismo de travamento com setnx

Vamos assumir um jogo online em que vários jogadores acessarão um balde de ouro comum de propriedade de sua equipe. Os jogadores podem acessar o balde de ouro e preenchê -lo com o ouro que encontraram explorando o mundo. Imagine o jogador um acessa o balde de ouro e solta um pouco de ouro dentro de um período fixo. Ao mesmo tempo, o jogador dois tenta consumir um pouco de ouro do mesmo balde. Nesse caso, o acesso não deve ser entregue ao jogador dois até que o jogador um libere o balde de ouro. Isso pode ser implementado com o comando setnx com um mecanismo de travamento simples.

O Jogador: 1 pode usar o comando setnx para definir a quantidade total de ouro no balde. Vamos supor que vamos armazenar a quantidade de ouro na chave Goldbucket.

Setnx Goldbucket 100

Como esperado, o Goldbucket A chave foi criada com um valor de 100. Agora, Jogador: 1 tem a fechadura. Digamos Jogador: 2 vai chamar o comando setnx para definir a nova quantidade de ouro.

Setnx Goldbucket 200

Desta vez, o comando retorna 0 porque a chave Goldbucket existe. Em outras palavras, a chave é bloqueada pelo Jogador: 1 já. Portanto, jogador: 2 tem que esperar até o jogador: 1 libera a trava excluindo ou o tempo limite automático.

Vamos verificar o valor associado ao Goldbucket chave, como mostrado no seguinte.

Obtenha Goldbucket

Como esperado, o valor ainda é 100, o que significa Jogador: 1 já bloqueou o valor dos dados. Por isso, Jogador: 2 precisa continuar esperando até o tempo limite expirar e Jogador: 1 libera.

Pode haver uma situação de impasse se o cliente travar ou falhar devido a uma falha de rede e o bloqueio não foi liberado pelo cliente travado. Vários clientes podem notar isso e tentar remover o bloqueio usando o comando del. Como resultado, cada cliente excluirá suas próprias chaves repetidamente, o que levará a um impasse.

Ele pode ser resolvido por cada cliente verificando o registro de data e hora usando o comando getSet e depois adquirir o bloqueio usando o comando setnx se e somente se o registro de data e hora expirou.

Conclusão

Para resumir, o Redis é um armazenamento de valor-chave que suporta os tipos de dados de string mais simples entre as outras estruturas de dados complexas, como hashes, conjuntos, bitmaps e listas. Como todos sabem, definir e obter são os comandos mais básicos que podem ser usados ​​para criar e buscar pares de valor-chave Redis. O método set é usado para criar pares de valor-chave no banco de dados Redis que eventualmente substitua o valor associado para uma chave especificada se a chave já existir no banco de dados. Conforme destacado anteriormente no artigo, essa mutação de valor insegura pode ser restrita ao comando Redis Setnx. O comando setnx define o valor para uma determinada chave se a chave já não existir. Sempre que existe uma chave, o comando não executa nada e retorna 0. Portanto, o comando setnx é usado para implementar mecanismos de travamento em aplicativos em tempo real.