Redis (detalles)

Tabla de contenido

¿Qué es Redis?

Las principales características de Redis.

Escenarios de uso de Redis

almacenamiento de sesión

Almacenamiento en caché

Implementar bloqueos distribuidos

¿Por qué Redis es tan rápido?

Operaciones basadas en memoria

Estructuras de datos eficientes

Modelo de multiplexación de múltiples E/S

ejecución de un solo hilo

Estructuras de datos comunes en Redis

Implementación de la lista ordenada de Redis

Flujo de ejecución de la tabla de salto

Implementación de bloqueo distribuido de Redis

Problemas con el uso de bloqueos distribuidos

Se produce un punto muerto

Bloqueo eliminado accidentalmente

Estrategia de no pérdida de datos de Redis

La diferencia entre RDB y AOF

RDB

AOF

avalancha de caché

solución:

Desglose de caché

solución

penetración de caché

 solución:

resumen


Prefacio

Redis es actualmente el middleware de almacenamiento en caché más popular, y los desarrolladores tienen requisitos cada vez más altos para Redis. El dominio competente de los conocimientos básicos de Redis es la piedra angular para que un desarrollador desarrolle sistemas de alto rendimiento y alta disponibilidad.

¿Qué es Redis?

Redis es un sistema de almacenamiento de datos en memoria de código abierto, a menudo denominado almacenamiento de caché y almacenamiento de valores clave. Es una base de datos liviana y de alto rendimiento conocida por admitir tipos de datos enriquecidos y varias funciones avanzadas. Es el más popular. de las bases de datos NoSQL, por lo que es adoptado por muchas aplicaciones.

Las principales características de Redis.

  • almacenamiento de memoria
  • almacenamiento de valores clave
  • tipo de datos
  • persistencia
  • publicar-suscribir
  • asuntos
  • Alta disponibilidad

Escenarios de uso de Redis

  • almacenamiento de sesión
  • Almacenamiento en caché
  • Implementar bloqueos distribuidos

almacenamiento de sesión

Redis se puede utilizar para almacenar datos de sesiones de usuarios. El almacenamiento de sesiones en redis puede implementar fácilmente una gestión de sesiones distribuida y de alta disponibilidad y garantizar que las sesiones de los usuarios sean coherentes en varios servidores.

Almacenamiento en caché

El almacenamiento en caché es uno de los escenarios de uso más comunes de Redis, que almacena datos a los que se accede con frecuencia en Redis, puede mejorar la eficiencia de toda la aplicación y reducir la presión sobre el servidor de base de datos back-end.

Implementar bloqueos distribuidos

Dado que redis admite inherentemente sistemas distribuidos, la operación de bloqueo en redis es un bloqueo distribuido, que puede garantizar la exclusión mutua y los recursos compartidos de múltiples clientes.

¿Por qué Redis es tan rápido?

Las principales razones por las que Redis es rápido son las siguientes:

  • Operaciones basadas en memoria
  • Estructuras de datos eficientes
  • Modelo de multiplexación de múltiples E/S
  • ejecución de un solo hilo

Operaciones basadas en memoria

Todas las operaciones de Redis se basan en la memoria, y la mayoría de las operaciones de Redis son funciones simples de lectura y escritura, mientras que el acceso y la mayoría de las operaciones se consumen en E / S, y la E / S es la más rápida es la memoria, porque las operaciones de acceso de memoria son mucho más rápidas que las operaciones de lectura del disco duro.

Estructuras de datos eficientes

Redis garantiza la eficiencia de Redis a través de una serie de estructuras de datos, que utilizan principalmente estructuras de datos eficientes, como cadenas dinámicas, tablas hash, listas doblemente vinculadas, listas comprimidas, tablas de salto, conjuntos, conjuntos ordenados y otras estructuras de datos eficientes. , los datos se pueden almacenar y recuperar de manera eficiente, esta es la condición básica para garantizar un alto rendimiento de redis

Modelo de multiplexación de múltiples E/S

Redis adopta un modelo de multiplexación de E/S multicanal. Multicanal se refiere a múltiples conexiones de red, y multiplexación se refiere a múltiples E/S que multiplexan un subproceso para su operación. Esto permite a Redis manejar la concurrencia sobre la base de un solo subproceso. solicitudes, el modelo de E/S multiplexada se implementa internamente utilizando el proxy epool. epool monitoreará múltiples eventos de flujo de E/S al mismo tiempo. Cuando no haya eventos, se bloqueará.

ejecución de un solo hilo

La ejecución de un solo subproceso de Redis evita perfectamente los problemas que ocurren en múltiples subprocesos, como la competencia sin bloqueo, la creación y destrucción de subprocesos y el consumo de tiempo causado por la programación y conmutación de subprocesos, lo que hace que Redis sea más eficiente en subprocesos únicos. mucho mayor que la ejecución multiproceso.

Estructuras de datos comunes en Redis

Hay cinco estructuras de datos comunes en redis: cadena, lista, tabla hash hash, tipo de colección de conjuntos y lista de conjuntos ordenados.

Los usos comunes de estos 5 tipos son los siguientes:

1. Cadena. Los escenarios de uso comunes incluyen almacenar información de sesión de usuario, almacenar información de caché y almacenar información de enteros. Puede usar incr para implementar el entero +1 y decr para implementar el entero -1.

2. Tipo de lista: los escenarios de uso comunes incluyen implementar una cola de mensajes simple y almacenar datos en una lista determinada.

3. Tipo de hash hash. Los escenarios de uso comunes incluyen almacenar información de sesión y carritos de compras para almacenar productos. El carrito de compras es muy adecuado para ser representado por un diccionario hash. El número único de la persona se utiliza como clave del diccionario. value value puede almacenar la identificación y la cantidad del producto. Espere información, almacene la información de la página de detalles

4. El tipo de colección Set es una colección de valores clave única y no válida. Su escenario de uso tiene la función de atención del usuario y se puede almacenar en una colección para garantizar que la información del usuario no se repita.

5. El tipo de colección Conjunto ordenado es un conjunto ordenado y único de valores clave. Los escenarios de uso comunes incluyen el almacenamiento de información de clasificación y las siguientes funciones de lista.

Implementación de la lista ordenada de Redis

La lista ordenada se implementa mediante la lista de compresión ziplist y la lista de salto skiplist.

  1. La lista comprimida se implementa como una matriz de bytes. Es una estructura de datos lineal diseñada por redis para ahorrar memoria. Puede contener varios elementos y cada elemento puede ser una matriz de bytes o un número entero.
  2. Una lista de omisión es una estructura de datos ordenada que mantiene direcciones que apuntan a múltiples nodos en cada nodo para permitir un acceso rápido a los nodos.

Nota: Cuando los datos son relativamente pequeños, se usa una lista comprimida para el almacenamiento. Por el contrario, cuando hay una gran cantidad de datos, se usa una lista comprimida para el almacenamiento. Se deben cumplir las dos condiciones siguientes para usar una lista comprimida. :

1. El número de elementos en un conjunto ordenado debe ser inferior a 128.

2. La longitud de cada miembro del elemento almacenado en el conjunto ordenado debe ser inferior a 64 bytes.

Si no se cumple alguna de las condiciones anteriores, se utilizará el almacenamiento en la tabla de salto.

Flujo de ejecución de la tabla de salto

La capa inferior de la lista de salto se implementa utilizando múltiples listas vinculadas.

Cuando se utilizan tablas de omisión, la eficiencia de las consultas será muy alta.

Consulta de tabla de salto:

Tomemos como ejemplo la consulta 32 en la figura anterior:

Primero, comience desde la lista enlazada de 2 niveles superior. Si 1 es menor que 32, muévalo hacia atrás una posición. 7 es menor que 32. Continúe retrocediendo una posición. Si se encuentra vacío, use 7 como objetivo y pasar a la siguiente capa. Busque en la primera capa. Si 18 es menor que 32, continúe moviéndose una posición hacia atrás. Si encuentra que 77 es mayor que 32, usará 18 como objetivo, pase a la siguiente capa para consultar y luego comparar los datos después de 18 en la capa 0. , encontramos 32.

Como se puede ver en el proceso anterior, la consulta de la tabla de salto comienza desde la capa superior. Si el valor del nodo en esta capa es mayor que el valor del nodo a consultar, o el nodo en esta capa es nulo , se buscará el nodo anterior. Como objetivo, pase al siguiente nivel y consulte en un bucle hasta que se conozca el nodo o sea nulo y luego regrese.

Implementación de bloqueo distribuido de Redis

Redis es inherentemente compatible con sistemas distribuidos, por lo que los bloqueos agregados en redis son bloqueos distribuidos. Los llamados bloqueos distribuidos son un concepto lógico en redis.

Utilice el comando setnx [valor clave] y el resultado de la ejecución del bloqueo es 1, lo que indica éxito.

Utilice el comando del [valor clave] para liberar el bloqueo

Bloqueo a través de setnx multicliente 1

 

En este momento, si se utiliza el cliente 2 para bloquear nuevamente, el bloqueo fallará.

 

Lo desbloqueo en el cliente 1 y el cliente 2 puede bloquearlo correctamente. 

Problemas con el uso de bloqueos distribuidos

Se produce un punto muerto

Se producirá un punto muerto: el hilo que obtuvo el bloqueo se desconecta, el bloqueo no se libera y el hilo que obtuvo el bloqueo solo ocupará el bloqueo, lo que provocará un punto muerto.

Solución: agregue un tiempo de espera (imite el modo MySQL de 10 segundos) y use el comando de caducidad.

Esto se resuelve estableciendo un tiempo de espera. Si el bloqueo no se libera después del tiempo de espera, el objeto de bloqueo se liberará automáticamente y no habrá problema de interbloqueo.

Bloqueo eliminado accidentalmente

El problema de la eliminación accidental del bloqueo: si el tiempo de ejecución de un determinado hilo es mayor que el tiempo de espera, se producirá el problema de la eliminación accidental del bloqueo.

Cuando el subproceso 1 adquiere el bloqueo y establece el tiempo de espera en 10 segundos, el subproceso 2 girará y esperará, pero el subproceso 1 en realidad tarda 15 segundos en ejecutarse, por lo que en el décimo segundo, debido a que el tiempo de espera ha expirado, el subproceso 1 bloqueará Liberar, el subproceso 2 lo hará. obtener el bloqueo. Cuando el subproceso 1 complete los 15 segundos de ejecución, el bloqueo se eliminará. Dado que el bloqueo ya ha sido adquirido por el subproceso 2, el subproceso 1 eliminará el bloqueo del subproceso 2. El bloqueo se elimina.

Solución: agregue un identificador al candado. Al eliminar, determine si el candado pertenece al hilo actual. Si pertenece al hilo actual, elimínelo. Si no, no lo elimine.

Estrategia de no pérdida de datos de Redis

Se cree que los datos de Redis se almacenan en la memoria y los datos en la memoria se perderán después de un corte de energía. Redis utiliza tecnología de persistencia para resolver este problema.

Tres formas de persistencia de Redis:

  • El método de instantánea (RDB) escribe datos de la memoria en un momento determinado en el disco en forma binaria
  • El modo de agregar archivos (AOF) registra todas las instrucciones de operación (set del) y las agrega al archivo en forma de texto.
  • La persistencia híbrida combina las ventajas de RDB y AOF: al escribir, los datos actuales se escribirán en RDB y los datos posteriores se escribirán en AOF.

La diferencia entre RDB y AOF

RDB y AOF son dos estrategias para la persistencia de Redis.

RDB

Principio de funcionamiento: registre los datos en la memoria en un momento determinado y escríbalos en el disco duro en formato binario.

ventaja:

  • La eficiencia de ejecución es relativamente alta, debido a que son datos binarios, es más rápido al escribir en el disco duro y al recuperar, la eficiencia también es muy alta.
  • El archivo es relativamente pequeño y ocupa menos espacio en el disco duro.

defecto:

Dado que se registran datos en un momento determinado, si ocurre una falla durante la instantánea de Redis, es posible que se pierdan todos los datos en ese momento.

AOF

Principio de funcionamiento: agregue el archivo de registro de Redis al archivo del disco duro en forma de texto. Cuando es necesario reiniciar Redis, los datos se restauran reproduciendo el contenido del archivo del disco duro.

ventaja:

  • La integridad de los datos es relativamente buena.
  • Dado que el archivo es un archivo de texto, será muy conveniente al verlo.

defecto:

  • Debido al método de agregar, el archivo del disco duro se hará cada vez más grande con el tiempo. Cuando es necesario reiniciar redis, afectará la eficiencia del reinicio.
  • El acceso frecuente al disco duro requiere la escritura frecuente de archivos, lo que puede ejercer presión sobre el disco duro.

avalancha de caché

En un corto período de tiempo, una gran cantidad de cachés caducan al mismo tiempo, lo que resulta en una gran cantidad de solicitudes que acceden a la base de datos, lo que ejerce presión sobre el servidor de la base de datos y, en casos graves, hace que el servidor de la base de datos falle.

Acceso normal al caché:

Acceso después de una avalancha de caché 

 

solución:

  1. Cola de bloqueo: la cola de bloqueo se puede realizar mediante sincronización, lo que puede desempeñar una función de almacenamiento en búfer para evitar que una gran cantidad de usuarios accedan a la base de datos al mismo tiempo, pero la desventaja es que aumenta el tiempo de respuesta del sistema.
  2. Aleatorizar el tiempo de caducidad de la caché: para evitar que una gran cantidad de cachés caduquen al mismo tiempo, puede establecer un tiempo de caducidad aleatorio para la caché, lo que evita que una gran cantidad de cachés caduquen al mismo tiempo.
  3. Utilice el caché de segundo nivel: además del propio Redis, configure un caché (por ejemplo, una tabla hash). Cuando Redis falla, primero consulte el caché de segundo nivel.

Utilizamos principalmente un tiempo de caducidad de caché aleatorio.

Desglose de caché

La avería del caché significa que un determinado caché activo falla en un momento determinado, y luego hay una gran cantidad de solicitudes concurrentes en este momento. En este momento, estas grandes cantidades de solicitudes concurrentes accederán directamente a la base de datos, lo que causará una gran presión en la base de datos. Esta situación se llama penetración de caché.

solución

  1. Cola de bloqueo: similar a la solución de avalancha de caché, la cola de bloqueo se utiliza al consultar la base de datos y las solicitudes de operación de almacenamiento en búfer se utilizan para reducir la presión operativa del servidor.
  2. La configuración nunca caduca: para algunos cachés de puntos de acceso, podemos configurarlos para que nunca caduquen, lo que puede garantizar la estabilidad del caché. Sin embargo, debe prestar atención a actualizar el caché de puntos de acceso a tiempo después de que cambien los datos, de lo contrario, se producirán errores. en los resultados de la consulta. .

 Utilizamos principalmente configuraciones que nunca caducan.

penetración de caché

La penetración de caché significa que no hay datos en la base de datos de consulta ni en el caché. Debido a que la base de datos no tiene datos, por consideraciones de tolerancia a fallas, los resultados no se guardarán en redis, por lo que se consultará la base de datos para cada solicitud. Esta situación es caché penetración.

 solución:

Independientemente de si se consulta la base de datos o no, los resultados se guardan en redis.

resumen

Este artículo presenta las preguntas de entrevistas más comunes sobre Redis.

Ahora corro duro sólo para alcanzar el yo en el que alguna vez tuve grandes esperanzas.

Supongo que te gusta

Origin blog.csdn.net/qq_63525426/article/details/132760533
Recomendado
Clasificación