31 preguntas más comunes de la entrevista de Redis

Directorio de artículos

¿Qué es Redis?

El nombre completo de redis: Remote Dictionary Server.

Redis es esencialmente una base de datos en memoria de tipo clave-valor, muy similar a memcached. Toda la base de datos se carga en la memoria para su funcionamiento y los datos de la base de datos se descargan en el disco duro para su almacenamiento periódicamente mediante operaciones asincrónicas.

Debido a que es una operación de memoria pura, Redis tiene un rendimiento excelente. Puede manejar más de 100,000 operaciones de lectura y escritura por segundo. Es la base de datos de valores clave más rápida conocida. La velocidad de lectura es 110000 veces / s, y la velocidad de escritura es 81000 veces / s

La excelencia de Redis no es solo el rendimiento. El mayor encanto de Redis es que admite el almacenamiento de múltiples estructuras de datos. Además, el límite máximo de un solo valor es de 512 MB, a diferencia de Memcached, que solo puede almacenar 1 MB de datos.

Por lo tanto, Redis se puede usar para implementar muchas funciones útiles, como usar su lista como una lista FIFO doblemente vinculada, implementar un servicio de cola de mensajes liviano de alto rendimiento y usar su conjunto como un sistema de etiquetas de alto rendimiento. Además, Redis también puede establecer el tiempo de vencimiento para el valor clave almacenado, por lo que también se puede utilizar como una versión mejorada de memcached.

La principal desventaja de Redis es que la capacidad de la base de datos está limitada por la memoria física y no se puede utilizar para la lectura y escritura de datos masivos de alto rendimiento. Por lo tanto, los escenarios adecuados para Redis se limitan principalmente a operaciones de alto rendimiento y cálculos con una pequeña cantidad de datos.

¿Cuáles son las ventajas de Redis?

  • Rendimiento muy alto: Redis puede leer 110.000 veces / s y escribir 81.000 veces / s.
  • Tipos de datos enriquecidos: Redis admite los tipos de datos String, List, Hash, Set y Sorted Set.
  • Seguridad de subprocesos: todas las operaciones de Redis son atómicas, lo que significa que tienen éxito o fallan en absoluto. Una sola operación es atómica. Varias operaciones también admiten transacciones, es decir, atomicidad, empaquetadas con instrucciones MULTI y EXEC.
  • Funciones enriquecidas: Redis también admite publicación / suscripción, notificación, caducidad de claves y otras funciones.

¿Cuáles son los escenarios adecuados para Redis?

  1. Uso compartido de sesiones (inicio de sesión único)
  2. Caché de página
  3. cola
  4. Tabla de clasificación / Contador
  5. Publicar / suscribirse

Por qué Redis es de un solo subproceso

Las preguntas frecuentes oficiales indicaron que debido a que Redis es una operación basada en memoria, la CPU no es el cuello de botella de Redis. El cuello de botella de Redis probablemente sea el tamaño de la memoria de la máquina o el ancho de banda de la red. Dado que el subproceso único es fácil de implementar y la CPU no se convertirá en un cuello de botella, es lógico adoptar una solución de un solo subproceso (después de todo, el subproceso múltiple será un gran problema). Redis utiliza tecnología de cola para convertir el acceso concurrente en acceso en serie.

El único hilo que hemos estado enfatizando aquí es que solo hay un hilo para procesar nuestras solicitudes de red. Cuando se está ejecutando un servidor Redis formal, debe haber más de un hilo. ¡Aquí debemos prestarle atención claramente! Por ejemplo, cuando Redis persiste, se ejecutará en un subproceso o subproceso.

¿Por qué Redis de un solo subproceso es tan rápido?

  1. Operaciones de memoria pura: la mayoría de las solicitudes son operaciones de memoria pura, que son muy rápidas. Los datos se almacenan en la memoria, similar a HashMap. La ventaja de HashMap es que la complejidad de tiempo de búsqueda y operación es O (1);
  2. La estructura de datos es simple y la manipulación de datos también es simple.
  3. La operación de un solo subproceso evita cambios de contexto innecesarios y condiciones de carrera. No hay cambios causados ​​por múltiples procesos o subprocesos para consumir CPU. No hay necesidad de considerar varios problemas de bloqueo. No hay operación de liberación de bloqueo y no hay posibilidad Consumo de rendimiento causado por interbloqueo.
  4. Se adopta un mecanismo de multiplexación de E / S sin bloqueo de multiplexación, donde "múltiple" se refiere a múltiples conexiones de red y "multiplex" se refiere a multiplexar el mismo hilo.

¿Por qué redis necesita poner todos los datos en la memoria?

Para lograr la velocidad de lectura y escritura más rápida, Redis lee todos los datos en la memoria y escribe los datos en el disco de manera asincrónica. Entonces, redis tiene las características de rapidez y persistencia de datos. Si no almacena los datos en la memoria, la velocidad de E / S del disco afectará seriamente el rendimiento de redis. Hoy en día, cuando la memoria se vuelve más barata, los redis serán cada vez más populares.

¿Cuáles son las diferencias entre Memcache y Redis?

  1. redis apoya la persistencia

Memcache no tiene un mecanismo de persistencia, por lo que todos los datos almacenados en caché no son válidos cuando se caen.

Redis admite la persistencia de datos, que puede mantener los datos en la memoria en el disco, y puede cargarse nuevamente para usar al reiniciar, y tiene un mejor mecanismo de recuperación de desastres.

  1. Redis admite más tipos de datos:

Memcache solo admite tipos de datos simples y requiere que el cliente maneje objetos complejos por sí mismo. Redis no solo admite datos de tipo k / v simples, sino que también proporciona almacenamiento para listas, conjuntos, zset, hash y otras estructuras de datos.

  1. Utilice diferentes modelos subyacentes

La implementación subyacente entre ellos y el protocolo de aplicación para la comunicación con el cliente son diferentes. Redis construyó directamente el mecanismo de VM en sí mismo, debido a que el sistema general llama a las funciones del sistema, perderá una cierta cantidad de tiempo para moverse y solicitar.

Tipos de datos de Redis y escenarios de uso de cada tipo de datos

Hay cinco tipos de datos: cadena, hash, lista, conjunto, conjunto ordenado.

  1. Cuerda

Para las operaciones set / get más convencionales, el valor puede ser una cadena o un número. Generalmente se utiliza para almacenar en caché cadenas de uso común o para almacenar en caché algunas funciones de conteo complejas.

  1. Picadillo

El valor almacenado aquí es un objeto estructurado y es más conveniente manipular uno de los campos. Generalmente se usa para almacenar en caché un objeto.

  1. lista

Usando la estructura de datos de List, puede hacer una función de cola de mensajes simple. Además, puede utilizar el comando lrange para realizar la función de paginación basada en redis, que tiene un rendimiento excelente y una buena experiencia de usuario.

  1. conjunto

Porque set es una colección de valores únicos. Entonces puede realizar la función de deduplicación global. Además, al utilizar operaciones como intersección, unión y diferencia, puede calcular las preferencias comunes, todas las preferencias y sus propias preferencias únicas.

  1. conjunto ordenado

El conjunto ordenado tiene una puntuación de parámetro de peso más, y los elementos del conjunto se pueden organizar según la puntuación. Se puede utilizar como una aplicación de tabla de clasificación para realizar operaciones TOP N.

¿Cuál es la capacidad máxima que puede almacenar un valor de cadena?

512M

La estrategia de caducidad y la estrategia de eliminación de memoria de Redis

Redis utiliza una estrategia de eliminación regular + eliminación diferida

¿Por qué no es necesario eliminar redis con regularidad?

La eliminación programada se refiere al uso de un temporizador para monitorear la clave, y se eliminará automáticamente cuando expire. Aunque la memoria se libera a tiempo, consume mucho los recursos de la CPU. En el caso de grandes solicitudes simultáneas, la CPU utilizará tiempo para procesar la solicitud en lugar de eliminar la clave, por lo que esta estrategia no se adopta.

¿Cómo funciona la eliminación regular + la eliminación diferida?

Eliminar periódicamente, redis comprueba cada 100 ms de forma predeterminada para ver si hay una clave caducada, y si hay una clave caducada, elimínela. Cabe señalar que redis no comprueba todas las claves una vez cada 100 ms, sino que las selecciona aleatoriamente para su inspección (si cada 100 ms, todas las teclas están marcadas, redis no está bloqueado). Por lo tanto, si solo se adopta la estrategia de eliminación regular, muchas claves no se eliminarán a tiempo.
Por lo tanto, la eliminación diferida es útil. En otras palabras, cuando obtenga una clave, redis verificará, si la clave está configurada con un tiempo de vencimiento, ¿vence? Si caduca, se eliminará.

¿Hay algún otro problema con la eliminación regular + eliminación diferida?

No, si elimina la clave con regularidad, la clave no se elimina. Entonces no solicitó la clave a tiempo, lo que significa que la eliminación diferida no tuvo efecto. De esta manera, la memoria de redis aumentará cada vez más y, finalmente, la memoria puede llenarse y el servicio se bloqueará. En este momento, se debe adoptar el mecanismo de eliminación de memoria.

Existe una línea de configuración en redis.conf para configurar la estrategia de eliminación de memoria:

maxmemory-policy volatile-lru

Hay 6 estrategias de eliminación de memoria:

  • no-desalojo: las solicitudes de escritura no se seguirán atendiendo (las solicitudes DEL pueden seguir atendiéndose), las solicitudes de lectura pueden continuar. Esto puede garantizar que no se pierdan datos, pero hará que el negocio en línea sea insostenible. Esta es la estrategia de eliminación predeterminada.
  • Volatile-lru: intente eliminar la clave con un tiempo de vencimiento, y la clave menos utilizada se eliminará primero. Las claves que no tienen un tiempo de caducidad no se eliminarán, lo que garantiza que los datos que deben conservarse no se perderán repentinamente. (Este es el más usado)
  • volatile-ttl: Igual que el anterior, excepto que la estrategia de eliminación no es LRU, sino el valor de la vida restante ttl de la clave. Cuanto menor sea el ttl, más prioridad se eliminará, es decir, los datos que caducarán.
  • volatile-random: selecciona aleatoriamente los datos que se eliminarán del conjunto de datos (server.db [i] .expires) con un tiempo de vencimiento establecido
  • allkeys-lru: a diferencia de volatile-lru, el objeto clave que debe eliminarse con esta estrategia es el conjunto de claves completo, no solo el conjunto de claves caducadas. Esto significa que también se eliminarán las claves sin tiempo de caducidad.
  • allkeys-random: selecciona arbitrariamente datos de todo el conjunto de claves (server.db [i] .dict) para eliminar

Si la clave no establece el tiempo de vencimiento, entonces el comportamiento de volatile-lru, volatile-ttl, volatile-random es similar a no-eviction

Hay datos de 2000w en MySQL y solo 20w en redis. ¿Cómo asegurarse de que los datos en redis sean todos hot data?

Cuando el tamaño del conjunto de datos de la memoria de redis aumenta a un cierto tamaño, se implementará la estrategia de eliminación de datos.

Suponga que hay 100 millones de claves en Redis, y 10 de ellas comienzan con un prefijo conocido fijo. ¿Y si puede encontrarlas todas?

Utilice el comando keys para escanear la lista de claves del modo especificado.

Luego, la otra parte preguntó: Si este redis está proporcionando servicios a empresas en línea, ¿qué problemas habrá con el uso del comando de claves?

En este momento, debe responder una de las características clave de redis: redis de un solo subproceso. La instrucción de claves hará que el hilo se bloquee por un período de tiempo y el servicio en línea se pausará. El servicio no se puede restaurar hasta que se ejecute la instrucción. En este momento, puede usar el comando de escaneo. El comando de escaneo puede extraer la lista de claves del modo especificado sin bloquear, pero habrá una cierta probabilidad de repetición. Es suficiente hacer la deduplicación una vez en el lado del cliente, pero el tiempo total será más que un uso directo La instrucción de las teclas es larga.

¿Has usado Redis como una cola asincrónica? ¿Cómo lo usas?

Generalmente, la estructura de la lista se usa como una cola, rpush produce mensajes y lpop consume mensajes. Cuando no haya ningún mensaje de lpop, debe dormir un rato y volver a intentarlo.

Si la otra parte pregunta, ¿no puedo dormir?

La lista también tiene un comando llamado blpop, cuando no hay mensaje, se bloqueará hasta que llegue el mensaje.

Si la otra parte pregunta si puede producir una vez y consumir varias veces.

Usando el modo de suscriptor de tema pub / sub, se puede realizar una cola de mensajes 1: N.

Si la otra parte pregunta, ¿cuáles son las desventajas de pub / sub?

Cuando el consumidor se desconecta, el mensaje producido se perderá. En este caso, se debe utilizar una cola de mensajes profesional como RabbitMQ.

Si la otra parte pregunta cómo redis implementa la cola de retraso.

Use sortedset, use la marca de tiempo como la puntuación y el contenido del mensaje como la clave para llamar a zadd para producir el mensaje. Los consumidores usan el comando zrangebyscore para obtener el sondeo de datos N segundos antes para su procesamiento.

Mecanismo de persistencia de Redis

Redis es una base de datos en memoria que admite la persistencia. Los datos en la memoria se sincronizan con los archivos del disco duro a través de un mecanismo de persistencia para garantizar la persistencia de los datos. Cuando Redis se reinicia, al volver a cargar el archivo del disco duro en la memoria, se puede lograr el propósito de la recuperación de datos.

Mecanismo de implementación: cree fork () un proceso hijo por separado, copie los datos de la base de datos del proceso padre actual en la memoria del proceso hijo y luego escríbalos en un archivo temporal por el proceso hijo, el proceso de persistencia ha terminado y luego reemplácelo con este archivo temporal El último archivo de instantánea, luego el proceso hijo sale y se libera la memoria.

Dos mecanismos de persistencia: RDB y AOF.

RDB: método de persistencia predeterminado de Redis. Según una determinada estrategia de período de tiempo, los datos de la memoria se guardan en el archivo binario del disco duro en forma de instantánea. Es decir, almacenamiento de instantáneas, el archivo de datos correspondiente es dump.rdb y el ciclo de instantáneas se define mediante el parámetro de guardado en el archivo de configuración.

AOF: Redis agregará cada comando de escritura recibido al final del archivo a través de la función Write, similar al binlog de MySQL. Cuando Redis se reinicia, volverá a ejecutar el comando de escritura guardado en el archivo para reconstruir el contenido de toda la base de datos en la memoria.

Ventajas y desventajas de RDB y AOF

Resistencia RDB

Ventajas: los archivos RDB son compactos, de tamaño pequeño, rápidos en la transmisión de red, adecuados para copia completa; la velocidad de recuperación es mucho más rápida que AOF. Por supuesto, en comparación con AOF, una de las ventajas más importantes de RDB es que tiene un impacto relativamente pequeño en el rendimiento.

Desventajas: la gran desventaja de los archivos RDB es que la persistencia de las instantáneas de datos determina que no se puede lograr la persistencia en tiempo real. Hoy en día, cuando los datos se vuelven cada vez más importantes, una gran cantidad de pérdida de datos a menudo es inaceptable, por lo que la persistencia AOF Conviértete en la corriente principal. Además, los archivos RDB deben cumplir un formato específico y tener poca compatibilidad (por ejemplo, la versión anterior de Redis no es compatible con la nueva versión de los archivos RDB).

Persistencia AOF

La ventaja de AOF es que admite la persistencia de segundo nivel y una buena compatibilidad.

Las desventajas son archivos grandes, velocidad de recuperación lenta y gran impacto en el rendimiento.

¿Cómo entender la transacción de Redis?

La transacción es una operación aislada separada: todos los comandos de la transacción se serializan y ejecutan secuencialmente. Durante la ejecución de la transacción, no será interrumpida por solicitudes de comando enviadas por otros clientes.

Una transacción es una operación atómica: o se ejecutan todos los comandos de la transacción o no se ejecuta ninguno.

Pero redis no proporciona transacciones estrictas. Redis solo garantiza la ejecución en serie de los comandos y garantiza toda la ejecución. Sin embargo, cuando la ejecución del comando falla, no retrocederá, sino que continuará ejecutándose.

¿Cuáles son los comandos relacionados con las transacciones de Redis?

MULTI 、 EJECUTAR 、 DESCARTAR 、 VER

¿Cuáles son los clientes Java compatibles con Redis? ¿Cuál es la recomendación oficial?

Redisson, Jedis, lechuga, etc. La recomendación oficial es utilizar Redisson.

¿Cuál es la relación entre Redis y Redisson?

Redisson es un terminal avanzado de servicio al cliente de Redis, distribuido y coordinado, que puede ayudar a los usuarios a implementar fácilmente algunos objetos Java (filtro Bloom, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog).

¿Cuáles son las ventajas y desventajas de Jedis y Redisson?

Jedis es un cliente de la implementación de Java de Redis y su API proporciona un soporte completo de comandos de Redis;

Redisson implementa una estructura de datos Java distribuida y escalable. En comparación con Jedis, tiene funciones más simples. No admite operaciones de cadena y no admite funciones de Redis como clasificación, transacciones, canalizaciones y particiones. El propósito de Redisson es promover la separación de preocupaciones de los usuarios a Redis, para que los usuarios puedan enfocarse más en procesar la lógica empresarial.

¿Hablar sobre el concepto de tragamonedas hash de Redis?

El clúster de Redis no usa hash consistente, pero introduce el concepto de ranura de hash. El clúster de Redis tiene 16384 ranuras de hash. Después de la verificación CRC16, cada clave es módulo 16384 para decidir qué ranura colocar. Cada nodo del clúster Responsable de parte de la ranura hash.

¿En qué circunstancias la solución de clúster de Redis hará que todo el clúster no esté disponible?

En un clúster con tres nodos A, B y C, sin un modelo de replicación, si el nodo B falla, todo el clúster pensará que carece de ranuras en el rango de 5501-11000 y no está disponible.

¿Alguna vez ha utilizado el clúster de Redis, cuál es el principio del clúster?

  1. Redis Sentinal se centra en la alta disponibilidad. Cuando el maestro está inactivo, automáticamente promoverá el esclavo al maestro y continuará brindando servicios.
  2. Redis Cluster se centra en la escalabilidad. Cuando una sola memoria de redis es insuficiente, Cluster se utiliza para el almacenamiento de fragmentos.

¿Qué debería hacer la solución de clúster de redis? ¿Cuales son las opciones?

  1. twemproxy

El concepto general es que es similar a un método de proxy, y el método de uso no es diferente al de redis ordinario. Después de configurar múltiples instancias de redis debajo de él, cuando lo use, conéctese a twemproxy donde necesita conectarse a redis, y usará un proxy La identidad recibe la solicitud y utiliza el algoritmo hash coherente para transferir la solicitud al redis específico y luego devolver el resultado a twemproxy. Fácil de usar (en relación con redis solo es necesario modificar el puerto de conexión), la primera opción para la expansión de proyectos antiguos. Problema: la presión de la propia instancia de puerto único de twemproxy, después de usar un hash consistente, cambia el valor calculado cuando cambia el número de nodos de Redis y los datos no se pueden mover automáticamente al nuevo nodo.

  1. códigos

El esquema de agrupación en clúster más utilizado actualmente tiene el mismo efecto que twemproxy, pero admite la restauración de los datos del nodo antiguo en el nuevo nodo hash cuando cambia el número de nodos.

  1. redis cluster3.0

El propio clúster de Redis se caracteriza porque su algoritmo distribuido no es un hash consistente, sino el concepto de una ranura de hash y su propio soporte para la configuración de nodos esclavos.

  1. Implementado en la capa de código empresarial

Inicie algunas instancias de redis no relacionadas, en la capa de código, realice operaciones hash en las claves y luego vaya a las instancias de redis correspondientes para manipular los datos.

¿Cuál es la cantidad máxima de nodos en un clúster de Redis?

16.384.

¿Cómo elegir una base de datos para el clúster de Redis?

El clúster de Redis actualmente no puede realizar la selección de la base de datos, el valor predeterminado es 0 base de datos.

¿Cuál es el modelo de replicación maestro-esclavo del clúster de Redis?

Para que el clúster siga estando disponible cuando algunos nodos fallan o la mayoría de los nodos no se pueden comunicar, el clúster utiliza un modelo de replicación maestro-esclavo y cada nodo tiene N-1 réplicas.

¿Se perderán las operaciones de escritura en el clúster de Redis? ¿por qué?

Redis no garantiza una sólida coherencia de los datos, lo que significa que, en la práctica, el clúster puede perder operaciones de escritura en determinadas condiciones.

¿Cómo es la replicación entre clústeres de Redis?

Replicación asincrónica

Problemas y soluciones comunes de rendimiento de Redis

  1. Es mejor no escribir instantáneas de memoria para Master. Si Master escribe instantáneas de memoria y el comando save programa la función rdbSave, bloqueará el trabajo del subproceso principal. Cuando la instantánea es grande, el impacto en el rendimiento será muy grande y el servicio se suspenderá de forma intermitente.
  2. Si los datos son más importantes, un esclavo activa AOF para hacer una copia de seguridad de los datos y la política se configura para sincronizar una vez por segundo.
  3. Para la velocidad de la replicación maestro-esclavo y la estabilidad de la conexión, es mejor que el maestro y el esclavo estén en la misma LAN.
  4. Trate de evitar agregar bibliotecas esclavas a la estresante biblioteca maestra.
  5. No use una estructura gráfica para la replicación maestro-esclavo. Es más estable usar una estructura de lista enlazada individualmente, es decir: Maestro <- Esclavo1 <- Esclavo2 <- Esclavo3 ... Esta estructura es conveniente para resolver el problema de falla de un solo punto y realizar el reemplazo de Esclavo por Maestro. Si cuelga el maestro, puede iniciar Slave1 inmediatamente como maestro y los demás permanecen sin cambios.

¿Cómo optimiza Redis la memoria?

Use tablas hash (hashes) tanto como sea posible. La memoria utilizada por las tablas hash (lo que significa que el número almacenado en la tabla hash es pequeño) es muy pequeña, por lo que debe abstraer su modelo de datos en una tabla hash tanto como sea posible.

Por ejemplo, si tiene un objeto de usuario en su sistema web, no establezca una clave separada para el nombre del usuario, apellido, dirección de correo electrónico y contraseña, sino que almacene toda la información del usuario en una tabla hash.

Supongo que te gusta

Origin blog.csdn.net/kaihuishang666/article/details/104430833
Recomendado
Clasificación