sql >> Base de Datos >  >> NoSQL >> Redis

¿Cómo logra Redis el alto rendimiento y rendimiento?

Hay una gran cantidad de información en la documentación de Redis para comprender cómo funciona. Ahora, para responder específicamente a sus preguntas:

1) ¿Cómo se mantienen las conexiones?

Las conexiones se mantienen y administran mediante el bucle de eventos ae (diseñado por el autor de Redis). Todas las operaciones de E/S de la red son sin bloqueo. Puede ver ae como una implementación minimalista que utiliza el mejor mecanismo de demultiplexación de E/S de red de la plataforma (epoll para Linux, kqueue para BSD, etc...) al igual que libevent, libev, libuv, etc...

2) ¿Las conexiones son TCP o HTTP?

Las conexiones son TCP utilizando el protocolo Redis, que es un protocolo simple orientado a texto compatible con telnet que admite datos binarios. Este protocolo suele ser más eficaz que HTTP.

3) ¿Cómo se gestiona la memoria?

La memoria se gestiona basándose en un asignador de memoria de propósito general. En algunas plataformas, este es en realidad el asignador de memoria del sistema. En algunas otras plataformas (incluido Linux), se seleccionó jemalloc porque ofrece un buen equilibrio entre el consumo de CPU, el soporte de concurrencia, la fragmentación y el consumo de memoria. El código fuente de jemalloc es parte de la distribución de Redis.

A diferencia de otros productos (como Memcached), Redis no implementa un asignador de bloques.

Se han implementado varias estructuras de datos optimizadas sobre el asignador de uso general para reducir el consumo de memoria.

4) ¿Cuáles son las técnicas de sincronización utilizadas para lograr un alto rendimiento a pesar de las lecturas/escrituras de la competencia?

Redis es un bucle de eventos de un solo subproceso, por lo que no es necesario realizar ninguna sincronización, ya que todos los comandos están serializados. Ahora, algunos subprocesos también se ejecutan en segundo plano para fines internos. En los raros casos en que acceden a los datos gestionados por el subproceso principal, se utilizan primitivas clásicas de sincronización pthread (mutex, por ejemplo). Pero el 100 % de los accesos a datos realizados en nombre de múltiples conexiones de clientes no requieren ninguna sincronización.

Puede encontrar más información allí:Redis es de subproceso único, entonces, ¿cómo realiza E/S simultáneas?

¿Cuál es la diferencia entre una implementación estándar de una máquina con memoria caché y un servidor que puede responder a los comandos y una caja de Redis?

No hay diferencia. Redis es una implementación simple y sencilla de una máquina con memoria caché y un servidor que puede responder a los comandos. Pero es una implementación que se hace bien:

  • utilizando el modelo de bucle de eventos de un solo subproceso
  • utilizando estructuras de datos simples y minimalistas optimizadas para sus casos de uso correspondientes
  • ofreciendo un conjunto de comandos cuidadosamente elegidos para equilibrar el minimalismo y la utilidad
  • objetivo constante del mejor rendimiento bruto
  • bien adaptado a los mecanismos del sistema operativo moderno
  • proporcionar múltiples mecanismos de persistencia porque el enfoque de "una talla sirve para todos" es solo un sueño.
  • proporcionar los componentes básicos para los mecanismos HA (sistema de replicación, por ejemplo)
  • evitar apilar capas de abstracción inútiles como panqueques
  • lo que da como resultado una base de código limpia y comprensible con la que cualquier buen desarrollador de C puede sentirse cómodo