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

Redis:Race Condition e Single threaded


Se o Redis é de thread único, por que precisa do mecanismo de bloqueio.

O Redis é de fato (principalmente) de thread único, mas o bloqueio é necessário quando vários clientes tentam fazer coisas diferentes na proximidade temporal adjacente. O bloqueio discutido no RiA é exatamente isso - garantir que apenas um cliente/thread faça uma tarefa específica ou garantir que as atualizações não dêem errado.

Aqui está um exemplo de por que você precisaria de bloqueio, apesar da segmentação única do Redis:suponha que você tenha um valor no Redis, um número, por exemplo, armazenado em uma chave chamada foo . O código do seu aplicativo lê esse número (GET foo ), faz algo (por exemplo, adiciona 1) e escreve de volta (SET ). Quando você executa seu código em um único thread, é assim que ficaria:
App               Redis
 |---- GET foo ---->|
 |<------ 1 --------|
 |                  |
 | thinking...      |
 |                  |
 |--- SET foo 2 --->|
 |<----- OK --------|

Agora vamos ver o que acontece quando dois clientes de aplicativo tentam fazer isso:
App 1             Redis              App 2
 |---- GET foo ---->|                  |
 |<------ 1 --------|<--- GET foo -----|
 |                  |------- 1 ------->|
 | thinking...      |                  |
 |                  |       thinking...|
 |--- SET foo 2 --->|                  |
 |<----- OK --------|<--- SET foo 2 ---|
 |                  |------ OK ------->|

Aqui você pode ver imediatamente o que aconteceu sem travar, apesar do servidor ser (principalmente) single threaded - em vez de 3, foo O valor de 's é 2. À medida que você adiciona mais threads/clientes/aplicativos, as coisas podem dar muito e terrivelmente erradas quando vários escritores tentam modificar os dados sem coordenação (por exemplo, bloqueio).

O bloqueio otimista é apenas uma das maneiras de fazer isso, que o Redis oferece integrado por meio do WATCH mecanismo. Às vezes, no entanto, o otimismo - apesar de sua natureza fácil e feliz - não é a solução certa, então você precisará implementar mecanismos melhores/avançados/diferentes para evitar condições de corrida. Esses bloqueios podem, sem dúvida, ser implementados mesmo fora do Redis, mas se você já o estiver usando, também faz sentido gerenciar seus bloqueios nele.