Red de conocimiento informático - Problemas con los teléfonos móviles - Redis es un programa de un solo subproceso, ¿por qué es tan rápido?

Redis es un programa de un solo subproceso, ¿por qué es tan rápido?

Base de datos de memoria pura, si es solo un valor-clave simple, la memoria no es el cuello de botella. Normalmente, las búsquedas de hash pueden alcanzar el orden de millones por segundo.

El cuello de botella radica en la E/S de la red.

Según los 10000/s que midió, el cliente y redis deben implementarse en dos máquinas diferentes y solicitar redis de manera sincrónica. Cada solicitud debe enviarse a través de la red. Vaya a la máquina donde. Se encuentra redis y luego espera a que redis devuelva datos. La mayor parte del tiempo se dedica a la transmisión de la red.

Si redis y el cliente se colocan en la misma máquina, el retraso de la red será menor. Generalmente, puede alcanzar 60.000 veces por segundo o incluso más, dependiendo del rendimiento de la máquina.

Los bloqueos no son el principal factor que afecta al rendimiento. El rendimiento del bloqueo de subprocesos (mutex_lock) solo se degradará si se encuentra un conflicto y, en circunstancias normales, la probabilidad de encontrar un conflicto es muy baja. Si simplemente bloquea y libera el bloqueo, será muy rápido, decenas de millones de veces por segundo. Memcache utiliza una gran cantidad de bloqueos internamente y no se observa ninguna degradación del rendimiento.

Los subprocesos no son un factor importante que afecte el rendimiento. Como se mencionó en el primer punto, en circunstancias normales, la velocidad a la que el programa procesa los datos de la memoria es mucho mayor que la velocidad a la que los recibe la tarjeta de red. La ventaja de utilizar subprocesos es que se pueden procesar varias conexiones al mismo tiempo. En casos extremos, se puede mejorar la velocidad de respuesta.

Utilice epoll o libevent, etc., porque la programación IO asincrónica sin bloqueo solo puede hacer esto. La contraparte es la programación IO de bloqueo síncrono, que utiliza múltiples procesos o subprocesos para procesar múltiples conexiones, como Apache. En general, el rendimiento del modelo IO asíncrono sin bloqueo es mucho mayor que el del modelo IO con bloqueo síncrono. Puede consultar la comparación de rendimiento entre nginx y apache.

libevent no es más lento que ae_event implementado por el propio redis. La mayor parte del código debería ser que ae_event solo implemente las funciones requeridas por redis, mientras que libevent tiene más funciones, como temporizadores más rápidos y modelos de eventos de búfer. e incluso viene con procesamiento de protocolos DNS y HTTP. Y libevent es más general, mientras que redis solo se centra en la plataforma Linux.

Finalmente responde a la pregunta ¿dónde estás? 1. Operación de memoria pura 2. IO asíncrona sin bloqueo