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.