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

O Redis é de thread único, então como ele faz E/S simultânea?


Bem, depende de como você define a simultaneidade.

No software do lado do servidor, a simultaneidade e o paralelismo são frequentemente considerados como conceitos diferentes. Em um servidor, o suporte a E/Ss simultâneas significa que o servidor é capaz de atender vários clientes executando vários fluxos correspondentes a esses clientes com apenas uma unidade de computação. Nesse contexto, paralelismo significaria que o servidor é capaz de realizar várias coisas ao mesmo tempo (com várias unidades de computação), o que é diferente.

Por exemplo, um barman é capaz de cuidar de vários clientes enquanto ele só pode preparar uma bebida por vez. Assim, ele pode fornecer simultaneidade sem paralelismo.

Esta questão foi debatida aqui:Qual é a diferença entre simultaneidade e paralelismo?

Veja também esta apresentação de Rob Pike.

Um programa de thread único pode definitivamente fornecer simultaneidade no nível de E/S usando um mecanismo de (des)multiplexação de E/S e um loop de eventos (que é o que o Redis faz).

O paralelismo tem um custo:com os vários soquetes/múltiplos núcleos encontrados em hardware moderno, a sincronização entre threads é extremamente cara. Por outro lado, o gargalo de um mecanismo de armazenamento eficiente como o Redis é muitas vezes a rede, bem antes da CPU. Os loops de eventos isolados (que não requerem sincronização) são, portanto, vistos como um bom design para construir servidores eficientes e escaláveis.

O fato de as operações do Redis serem atômicas é simplesmente uma consequência do loop de eventos de thread único. O ponto interessante é que a atomicidade é fornecida sem custo extra (não requer sincronização). Ele pode ser explorado pelo usuário para implementar o bloqueio otimista e outros padrões sem pagar pela sobrecarga de sincronização.