Resumen de las preguntas de entrevista de alta frecuencia de Redis (Parte 2)

Tabla de contenido

1. ¿Qué es Big Key (clave grande) en Redis?

2. ¿Qué problemas causará Big Key?

3. ¿Cómo encontrar bigkey?

4. Por qué el comando keys * debe usarse con precaución en el entorno de producción de redis

5. Cómo hacer frente a la caducidad centralizada de un gran número de claves

6. Utilice operaciones por lotes para reducir las transferencias de red

7. Penetración de caché

8. Desglose de caché

9. Avalancha de caché

10. Caché contaminado (o lleno)

11. Redis admite un total de ocho estrategias de eliminación

12. Consistencia de la base de datos y la memoria caché


1. ¿Qué es Big Key (clave grande) en Redis?

Big Key en Redis se refiere a pares clave-valor que ocupan mucha memoria. En Redis, la memoria es un recurso preciado. Si algunos pares clave-valor ocupan demasiada memoria, el rendimiento del servidor de Redis se degradará e incluso puede provocar un desbordamiento de la memoria.

Específicamente, una clave grande en Redis generalmente se refiere a un par clave-valor que ocupa más de cierto umbral (por ejemplo, 10 KB). Estos pares clave-valor pueden incluir grandes cantidades de texto o datos binarios, o incluir una gran cantidad de campos hash o elementos de colección, etc. Para estas Big Keys, se requiere un procesamiento y una optimización especiales para reducir el uso de la memoria y mejorar el rendimiento y la confiabilidad del servidor Redis.

El motivo de la aparición de Redis Big Key puede ser que se almacene una gran cantidad de texto o datos binarios, o que se almacene una gran cantidad de campos hash o elementos de colección.

2. ¿Qué problemas causará Big Key?

Big Key (clave grande) es un par clave-valor que ocupa una gran cantidad de memoria en Redis. Si hay demasiadas Big Keys, tendrá un impacto negativo en el rendimiento y la confiabilidad del servidor Redis, incluidos los siguientes peligros :

  1. Ocupación de memoria: Big Key ocupa una gran cantidad de memoria. Si la memoria del servidor Redis es insuficiente, el rendimiento del servidor Redis disminuirá e incluso puede causar que el servidor Redis se bloquee.

  2. Retraso en la operación: al leer y escribir Big Key, ocupará una gran cantidad de recursos de CPU y recursos de IO, lo que resultará en un mayor retraso en la operación. Si hay varios clientes que operan Big Key al mismo tiempo, habrá mucha espera, lo que provocará una disminución en el rendimiento del servidor Redis.

  3. Retraso de persistencia: si es necesario conservar la clave grande, como escribir en un archivo RDB o un archivo AOF, se ocupará una gran cantidad de recursos de CPU y recursos de E/S, lo que dará como resultado un aumento en el retraso de persistencia. Si la carga del servidor Redis es demasiado alta, puede causar una falla de persistencia o una latencia alta, lo que afecta la confiabilidad y la consistencia de los datos.

  4. Pérdida de datos: si la memoria del servidor Redis es insuficiente, puede ocurrir un desbordamiento de la memoria, lo que resulta en la pérdida de datos de Big Key. Si la Big Key contiene datos importantes, puede causar pérdida de datos o inconsistencia de datos.

En resumen, la existencia de Big Key tendrá un impacto negativo en el rendimiento y la confiabilidad del servidor Redis, lo que puede generar problemas como el uso de la memoria, el retraso en la operación, el retraso en la persistencia y la pérdida de datos. Por lo tanto, se requiere un manejo y optimización especiales de Big Key para reducir el uso de memoria y mejorar el rendimiento y la confiabilidad del servidor Redis.

3. ¿Cómo encontrar bigkey?

--bigkeys1. Use los parámetros que vienen con Redis para encontrar rápidamente la clave grande. Los pasos específicos son los siguientes:

  1. Al iniciar el cliente de Redis, agregue --bigkeysparámetros, por ejemplo:
    redis-cli --bigkeys
    
  2. Después de que el cliente de Redis se conecte al servidor de Redis, ejecute comandos, por ejemplo:
    bigkeys
  3. El servidor Redis escaneará todos los valores clave, descubrirá los valores clave que ocupan una gran cantidad de memoria y devolverá su información, por ejemplo:
    bigkeys
    # Scanning the entire keyspace to find biggest keys as well as
    # average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
    # per 100 SCAN commands (not usually needed).
    [00.00%] Biggest string found so far 'my_big_string' with 100 bytes
    [00.00%] Biggest list found so far 'my_big_list' with 10 elements
    [00.00%] Biggest set found so far 'my_big_set' with 5 members
    [99.99%] Biggest zset found so far 'my_big_zset' with 1000 members
    [99.99%] Biggest hash found so far 'my_big_hash' with 10 fields
    -------- summary --------
    Sampled 10000 keys in the keyspace!
    Total key length in bytes is 51451 (avg len 5.15)
    Biggest string found 'my_big_string' has 100 bytes
    Biggest list found 'my_big_list' has 10 items
    Biggest set found 'my_big_set' has 5 members
    Biggest zset found 'my_big_zset' has 1000 members
    Biggest hash found 'my_big_hash' has 10 fields

    A través del método anterior, todas las claves grandes se pueden encontrar rápidamente y se puede entender su tamaño y tipo, para realizar una mayor optimización y procesamiento. Cabe señalar que el uso de --bigkeysparámetros escaneará toda la base de datos de Redis, lo que puede tener cierto impacto en el rendimiento del servidor de Redis, por lo que debe usarse en el momento adecuado.

2. Use los comandos de Redis (use con precaución en entornos de producción) : Redis proporciona algunos comandos para ver la información y el tamaño de todas las claves, por ejemplo, KEYSlos comandos pueden enumerar todos los nombres de las claves, TYPElos comandos pueden ver el tipo de valores de las claves y STRLENlos comandos pueden ver valores clave de cadena La longitud del LLENcomando puede ver la longitud del valor clave de la lista, etc. Estos comandos se pueden usar para descubrir claves grandes, por ejemplo, la longitud de un valor de clave de cadena supera el umbral, la longitud de un valor de clave de lista supera el umbral, etc.

3. Use las herramientas de Redis: Redis proporciona algunas herramientas para ayudar a descubrir Big Key, por ejemplo, redis-rdb-toolsla herramienta puede analizar el archivo RDB, enumerar la información y el tamaño de todos los valores clave, redis-clila herramienta puede conectarse al servidor de Redis y ejecutar algunos comandos. , como ver todas las claves Información de valor y tamaño, etc. Big Key se puede descubrir más fácilmente a través de estas herramientas.

4. Use herramientas de terceros: además de las herramientas integradas de Redis, existen algunas herramientas de terceros que pueden ayudar a descubrir Big Keys. Por ejemplo, la herramienta recomendada oficialmente por Redis puede bigkeysescanear la base de datos de Redis, encontrar todos Big Keys y ordenarlas por tamaño.

4. Por qué el comando keys * debe usarse con precaución en el entorno de producción de redis

En Redis, keysun comando es un comando para nombres de clave de coincidencia de patrones, que puede buscar nombres de clave coincidentes de acuerdo con un patrón específico, logrando así una recuperación rápida de datos. En el desarrollo real, es posible que necesitemos usar keyscomandos para consultar todos los nombres clave. Sin embargo, en el entorno de producción de Redis, debemos usar keys *los comandos con precaución por las siguientes razones:

  1. Problemas de rendimiento: keys *el comando atravesará toda la base de datos de Redis y cargará todos los nombres clave en la memoria, lo que puede consumir una gran cantidad de recursos del sistema, degradar el rendimiento del servidor de Redis e incluso provocar que el servidor de Redis se caiga.

  2. Problema de bloqueo: cuando Redis ejecuta keys *un comando, bloqueará las solicitudes de comando de todos los demás clientes hasta que keys *se complete la ejecución del comando, lo que puede provocar que las solicitudes de otros clientes se bloqueen, afectando así la velocidad de respuesta y la estabilidad del sistema.

Si necesita consultar los nombres de clave de un prefijo específico, puede usar el SCANcomando Redis, que puede iterar los nombres de clave en la base de datos en lotes, evitando cargar todos los nombres de clave a la vez, mejorando así el rendimiento y la estabilidad. Por ejemplo, puede usar el siguiente comando para consultar user:todos nombres de clave con el prefijo :

SCAN 0 MATCH user:*

Este comando devolverá un cursor y un lote de claves coincidentes, y puede obtener el siguiente lote de claves coincidentes según el valor del cursor. Cabe señalar que SCANcuando se utilizan comandos para consultar nombres de claves, algunos nombres de claves pueden repetirse o perderse, por lo que se requieren ciertas operaciones de procesamiento y deduplicación.

Además de usar SCANcomandos, también puede establecer índices en la estructura de datos de Redis o usar los comandos apropiados para consultar datos para mejorar la eficiencia y la precisión de la recuperación. Por ejemplo, cuando usa la estructura de datos Hash de Redis, puede usar HGETALLcomandos para consultar todos los campos y valores en lugar de consultar todos los nombres clave.

5. Cómo hacer frente a la caducidad centralizada de un gran número de claves

En Redis, cuando una clave caduca, Redis la eliminará automáticamente de la base de datos. Si hay una gran cantidad de claves en una base de datos de Redis y el tiempo de caducidad de estas claves es similar, cuando estas claves caduquen, pueden surgir algunos problemas, por ejemplo:

  1. Problema de uso de la memoria: cuando vence una gran cantidad de claves, es posible que la memoria ocupada por estas claves no se libere a tiempo, lo que hace que el uso de la memoria del servidor Redis continúe aumentando hasta que el servidor Redis se quede sin memoria y se bloquee.

  2. Problemas de rendimiento: cuando vence una gran cantidad de claves, el servidor Redis necesita gastar mucho tiempo de CPU para procesar la eliminación de estas claves vencidas, lo que puede causar que el rendimiento del servidor Redis se degrade, lo que afecta la velocidad de respuesta y estabilidad del servidor Redis.

Para evitar estos problemas, podemos tomar algunas medidas para mitigar el impacto de los juegos de claves caducados, como:

  1. Establezca razonablemente el tiempo de vencimiento de las claves: al usar Redis, es necesario establecer el tiempo de vencimiento de las claves razonablemente de acuerdo con los requisitos comerciales y las condiciones de los recursos del sistema, para evitar el vencimiento centralizado de una gran cantidad de claves. El tiempo de caducidad se puede ajustar según factores como los patrones de acceso a los datos y las necesidades comerciales.

  2. Tiempo de caducidad distribuido: al distribuir aleatoriamente el tiempo de caducidad de las claves, se pueden evitar los problemas causados ​​por la concentración de claves caducadas. Al configurar el tiempo de caducidad de la clave, se puede agregar un cierto factor aleatorio para que el tiempo de caducidad no sea exactamente el mismo.

  3. El uso de la característica Lazy-Free de Redis le permite a Redis retrasar la liberación de la memoria utilizada por las claves de manera asíncrona, evitando así bloquear el subproceso principal y mejorando el rendimiento y la estabilidad del servidor de Redis.

6. Utilice operaciones por lotes para reducir las transferencias de red

Redis admite comandos de operación por lotes.Al enviar varias solicitudes de comando al servidor de Redis a la vez, se puede reducir la cantidad de transmisiones de red, lo que mejora el rendimiento y la eficiencia del servidor de Redis. Los comandos comunes de operación por lotes son:

  1. Comandos MGET y MSET: el comando MGET puede obtener los valores de varias claves a la vez, y el comando MSET puede establecer los valores de varias claves a la vez. Por ejemplo, el siguiente comando puede obtener los valores de las teclas a, b y c a la vez:
    MGET a b c
    
  2. Comando DEL: El comando DEL puede eliminar varias claves a la vez. Por ejemplo, el siguiente comando elimina las teclas a, b y c a la vez:
    DEL a b c
    
  3. Comando PIPES: el comando PIPELINE puede empaquetar y enviar múltiples comandos al servidor de Redis, lo que reduce la cantidad de transmisiones de red y puede mejorar el rendimiento del servidor de Redis al obtener los resultados devueltos de múltiples comandos a la vez. Por ejemplo, el siguiente comando puede ejecutar varios comandos al mismo tiempo:
    REDISCLI> PIPELINE
    REDISCLI> SET a 1
    REDISCLI> INCR b
    REDISCLI> GET c
    REDISCLI> EXEC
    

    Cabe señalar que cuando se utilizan comandos de operación por lotes, es necesario establecer razonablemente los parámetros del comando y ajustar la configuración y los parámetros del servidor Redis de acuerdo con la situación real para lograr el mejor rendimiento y estabilidad.

7. Penetración de caché

La penetración de caché se refiere a consultar datos inexistentes. Dado que no hay datos en el caché, la solicitud de consulta pasa por alto el caché y consulta directamente la base de datos, lo que genera una presión excesiva en la base de datos. El problema de la penetración de caché es causado por factores tales como ataques maliciosos, tiempo de caducidad irrazonable de los datos almacenados en caché y distribución desigual de los datos comerciales.

Los ataques maliciosos son una forma común de penetración en la memoria caché. Los atacantes envían deliberadamente solicitudes de consulta inexistentes para consumir recursos de la base de datos. Por ejemplo, un atacante puede consultar la base de datos sin pasar por el caché agregando caracteres especiales en los parámetros de consulta o creando solicitudes maliciosas.

El tiempo de caducidad de datos de caché no razonable es otra causa común de penetración de caché. Si el tiempo de caducidad de los datos en la memoria caché es demasiado breve o no se establece en absoluto, la solicitud de consulta omitirá la memoria caché y consultará la base de datos una vez que caduquen los datos.

La distribución desigual de los datos empresariales también puede provocar el problema de la penetración de caché. Por ejemplo, si se accede a algunos datos calientes con mucha frecuencia mientras que a otros datos se accede con poca frecuencia, solo algunos de los datos calientes pueden almacenarse en la memoria caché mientras que otros datos no se almacenan en la memoria caché. Cuando la solicitud de consulta accede a datos que no están en la memoria caché, la memoria caché se omitirá para consultar la base de datos, lo que generará una presión excesiva sobre la base de datos.

Para resolver el problema de la penetración de caché, se pueden tomar las siguientes medidas:

  1. Bloom Filter: el filtro Bloom se usa para filtrar solicitudes de consulta, lo que puede identificar de manera efectiva si las solicitudes de consulta son legítimas. El filtro Bloom es una estructura de datos basada en hash que puede determinar rápidamente si un elemento está en un conjunto y tiene las características de alta eficiencia, rapidez y bajo almacenamiento.

  2. Caché de objetos vacíos: Guarde en caché algunos objetos vacíos en el caché. Cuando una solicitud de consulta accede a datos que no existen, devuelva el objeto vacío en el caché para evitar que las solicitudes de consulta pasen por alto el caché y accedan directamente a la base de datos.

  3. Establezca un tiempo de caducidad de caché razonable: establecer un tiempo de caducidad de caché razonable puede reducir el problema de la penetración de caché. En términos generales, el tiempo de caducidad de la memoria caché debe coincidir con la frecuencia de acceso de los datos comerciales para garantizar que los datos almacenados en la memoria caché sean todos datos activos.

  4. Limitación de solicitudes maliciosas: limitar la frecuencia de acceso y los parámetros de consulta de las solicitudes de consulta puede prevenir eficazmente ataques maliciosos y problemas de penetración de caché.

8. Desglose de caché

El desglose de caché se refiere al hecho de que bajo un acceso concurrente alto, después de que expira el caché de ciertos datos calientes, una gran cantidad de solicitudes inundan la base de datos, lo que provoca un aumento repentino de la presión en la base de datos, lo que afecta gravemente la estabilidad y el rendimiento de la base de datos. el sistema. El desglose de la memoria caché generalmente se debe a la frecuencia de acceso muy alta de los datos calientes, lo que da como resultado un tiempo de caducidad corto para los datos en la memoria caché y una gran cantidad de solicitudes de consulta, lo que conduce a la invalidación de los datos en la memoria caché al mismo tiempo. , lo que hace que una gran cantidad de solicitudes pasen por alto el caché y consulten directamente la base de datos.

Las soluciones para el desglose de caché generalmente incluyen lo siguiente:

  1. Bloqueo: cuando la memoria caché se vuelve inválida, los bloqueos distribuidos se pueden usar para serializar las solicitudes, lo que permite que solo una solicitud acceda a la base de datos, mientras que otras solicitudes esperan a que se devuelvan los resultados.

  2. Limitación actual: cuando la frecuencia de acceso a los datos del punto de acceso es muy alta, la limitación actual se puede utilizar para controlar la cantidad de solicitudes simultáneas y evitar la afluencia de una gran cantidad de solicitudes en un instante.

  3. Precalentamiento de datos: precargue datos calientes en la memoria caché y obtenga rápidamente datos de la memoria caché cuando falla, evitando que una gran cantidad de solicitudes pasen por alto la memoria caché para consultar directamente la base de datos.

  4. Carga de caché retrasada: cuando la caché falla, en lugar de consultar los datos en la base de datos inmediatamente, espera un período de tiempo antes de realizar la consulta. Si hay la misma solicitud de consulta durante el período, los datos en la caché se devuelven directamente.

  5. Use caché secundaria: almacene datos en caché de varios niveles al mismo tiempo, por ejemplo, almacene datos activos en caché de memoria y caché distribuida. Cuando falla la caché de memoria, los datos se pueden obtener de la caché distribuida para evitar que una gran cantidad de solicitudes pasen por alto la caché. Consulta la base de datos directamente.

  6. Configure los datos del punto de acceso para que nunca caduquen.

9. Avalancha de caché

La avalancha de caché se refiere al hecho de que, con un acceso simultáneo alto, una gran cantidad de datos en la caché fallan al mismo tiempo o el servicio de caché no está disponible, lo que provoca que una gran cantidad de solicitudes inunden la base de datos, lo que resulta en un aumento repentino de presión sobre la base de datos, afectando gravemente la estabilidad y el rendimiento del sistema. Las avalanchas de caché generalmente son causadas por factores como el tiempo de inactividad del servidor de caché y los datos almacenados en caché que caducan al mismo tiempo.

A diferencia de la falla del caché, la avalancha del caché es causada por una gran cantidad de datos en el caché que se invalida al mismo tiempo o el servicio de caché no está disponible, en lugar de ser causado por una frecuencia de acceso muy alta de ciertos datos calientes.

Las soluciones a la avalancha de caché generalmente tienen los siguientes tipos:

  1. Distribución de datos: distribuya uniformemente los datos en el caché a diferentes servidores para evitar problemas causados ​​por un tiempo de inactividad del servidor de caché o falla de datos al mismo tiempo.

  2. Limitación de corriente: en caso de falla de caché, se adopta el método de limitación de corriente para controlar la cantidad de solicitudes simultáneas y evitar la afluencia de una gran cantidad de solicitudes en un instante.

  3. Caché de copia de seguridad: Realice una copia de seguridad de los datos en la caché en otro servidor de caché o sistema de archivos local. Cuando la caché falla o el servicio no está disponible, puede restaurar rápidamente los datos desde la copia de seguridad, evitando una gran cantidad de solicitudes para omitir la caché y consultar directamente la base de datos.

  4. Desactualización del servicio: cuando falla la memoria caché o el servicio no está disponible, algunas funciones o interfaces se pueden proteger temporalmente a través de la degradación del servicio para garantizar el funcionamiento normal de las funciones principales.

  5. Aumente la aleatoriedad del período de validez del caché: aumente el período de validez aleatorio en el caché para evitar el problema de la avalancha de caché causada por una gran cantidad de invalidaciones de caché al mismo tiempo.

10. Caché contaminado (o lleno)

El problema de la contaminación del caché se refiere a algunos datos en el caché a los que solo se accederá una o varias veces. Después de acceder, nunca se volverá a acceder, pero esta parte de los datos aún permanece en el caché y consume espacio de caché.

La contaminación del caché aparecerá gradualmente a medida que los datos continúen aumentando. A medida que el servicio continúe ejecutándose, habrá una gran cantidad de datos en el caché a los que nunca se volverá a acceder. El espacio de caché es limitado. Si el espacio de caché está lleno, habrá una sobrecarga adicional al escribir datos en el caché, lo que afectará el rendimiento de Redis. Esta parte de la sobrecarga adicional se refiere principalmente a juzgar la estrategia de eliminación al escribir, seleccionar los datos que se eliminarán de acuerdo con la estrategia de eliminación y luego realizar la operación de eliminación.

Las soluciones generalmente tienen los siguientes tipos:

1. Establecer el tamaño máximo de caché

La elección del diseño del sistema es un proceso de compensaciones: una memoria caché de gran capacidad puede brindar beneficios de aceleración del rendimiento, pero el costo será mayor y una memoria caché de pequeña capacidad no necesariamente tiene el efecto de acelerar el acceso. En términos generales, recomendaría configurar la capacidad de la memoria caché entre el 15 % y el 30 % del volumen total de datos, teniendo en cuenta el rendimiento de acceso y la sobrecarga de espacio de memoria.

Para Redis, una vez que determine el tamaño máximo de la memoria caché, como 4 GB, puede usar el siguiente comando para establecer el tamaño de la memoria caché:

Sin embargo, es inevitable que la memoria caché se llene, por lo que se requiere una estrategia de eliminación de datos.

CONFIG SET maxmemory 4gb

 2. Usa una estrategia de eliminación de caché

11. Redis admite un total de ocho estrategias de eliminación

Redis admite un total de ocho estrategias de eliminación, a saber, las estrategias noeviction, volatile-random, volatile-ttl, volatile-lru, volatile-lfu, allkeys-lru, allkeys-random y allkeys-lfu.

¿Cómo lo entiendes? Se divide principalmente en tres categorías:

no eliminado

  • noeviction (predeterminado después de v4.0) no elimina, cuando la memoria es insuficiente, la nueva operación de escritura informará un error.

Eliminar datos con un tiempo de caducidad establecido

  • Aleatorio: volátil-aleatorio, de todas las claves, una parte de las claves se elimina aleatoriamente. Esta estrategia es adecuada para la situación en la que los datos almacenados en Redis no tienen distinción de importancia y la eliminación aleatoria de algunas claves no tendrá mucho impacto en los datos.
  • ttl: volatile-ttl, de las claves con tiempo de caducidad establecido, se elimina la clave con menor tiempo restante. Esta estrategia es adecuada para la situación en la que los datos almacenados en Redis tienen distinciones importantes y los datos con un tiempo de caducidad corto tienen prioridad para su eliminación.
  • lru: volatile-lru, de todas las claves, utilice el algoritmo LRU para eliminar, es decir, elimine la clave utilizada menos recientemente. Esta estrategia es adecuada para situaciones en las que los datos almacenados en Redis no tienen distinción de importancia.
  • lfu: volatile-lfu, a partir de las claves con tiempo de caducidad establecido, utilizar el algoritmo LFU para eliminar, es decir, eliminar las claves con menor frecuencia de uso. Esta estrategia es adecuada para la situación en la que los datos almacenados en Redis tienen distinciones importantes y se eliminan preferentemente los datos con baja frecuencia de uso.

Eliminar todos los datos

  • Random: allkeys-random, de todas las claves, eliminar aleatoriamente algunas claves. Esta estrategia es adecuada para la situación en la que los datos almacenados en Redis no tienen distinción de importancia y la eliminación aleatoria de algunas claves no tendrá mucho impacto en los datos.
  • lru: allkeys-lru, de todas las claves, utiliza el algoritmo LRU para eliminar, es decir, eliminar la clave utilizada menos recientemente. Esta estrategia es adecuada para situaciones en las que los datos almacenados en Redis no tienen distinción de importancia.
  • lfu: allkeys-lfu, de todas las claves, utilice el algoritmo LFU para eliminar, es decir, eliminar las claves con menor frecuencia. Esta estrategia es adecuada para situaciones en las que los datos almacenados en Redis no tienen distinción de importancia.

12. Consistencia de la base de datos y la memoria caché

Uno de los problemas más comunes al usar un caché es el problema de consistencia entre el caché y la base de datos. Dado que la memoria caché y la base de datos son dos sistemas independientes, cuando los datos se actualizan o eliminan, los datos de la memoria caché pueden caducar o volverse inválidos, lo que genera incoherencias entre los datos de la memoria caché y los datos de la base de datos. Esto puede causar problemas como:

  1. El problema de los datos sucios: los datos en el caché han caducado o caducado, pero el cliente aún obtiene los datos del caché. Esto puede causar errores o resultados incorrectos.

  2. El problema de la pérdida de datos: cuando se eliminan los datos de la base de datos, los datos de la memoria caché siguen existiendo, lo que provoca que los datos de la memoria caché se vuelvan incoherentes.

Para resolver estos problemas, es necesario asegurarse de que cuando se actualicen o eliminen los datos de la base de datos, también se actualicen o eliminen los datos almacenados en caché correspondientes. Se pueden utilizar las siguientes estrategias para garantizar la coherencia entre la base de datos y la memoria caché:

1. Esquema de doble borrado retrasado

Esta es una solución simple y efectiva. Su idea central es eliminar los datos en el caché primero al actualizar la base de datos, luego actualizar la base de datos y finalmente eliminar los datos en el caché nuevamente. Hacer esto asegura que cuando se invalide el caché, no se leerán datos antiguos de la base de datos.

Sin embargo, dado que lleva tiempo eliminar la memoria caché y actualizar la base de datos, es necesario agregar un tiempo de espera adecuado en el código para garantizar que la actualización de la base de datos se complete antes de que la memoria caché se vuelva inválida. Además, este esquema puede fallar si la memoria caché ha sido reescrita por otras operaciones durante el tiempo de espera.

2. Actualizar el esquema de caché

La idea central de esta solución es actualizar primero la base de datos y luego actualizar los datos en el caché al actualizar la base de datos. Esto asegura que los datos en el caché estén siempre actualizados.

Sin embargo, esta solución enfrenta un problema: cuando varias solicitudes actualizan los mismos datos al mismo tiempo, pueden aparecer datos sucios en el caché. Para resolver este problema, se pueden introducir bloqueos distribuidos o bloqueos optimistas para evitar actualizaciones simultáneas.

3. Esquema de consistencia de escritura doble

La idea central de esta solución es actualizar los datos en el caché al mismo tiempo que se actualiza la base de datos para garantizar que los datos en el caché y los datos en la base de datos sean siempre consistentes.

Sin embargo, esta solución enfrentará un problema: si falla la actualización de la base de datos y los datos en el caché se han actualizado, los datos en el caché se convertirán en datos sucios. Para resolver este problema, se pueden usar transacciones para garantizar la consistencia de los datos.Si falla la actualización de la base de datos, la transacción se revierte y los datos en el caché también se revierten. Además, también puede usar el esquema de coherencia de lectura después de escribir para actualizar primero la base de datos y luego actualizar la memoria caché para asegurarse de que los datos en la memoria caché deben estar actualizados. Si los datos almacenados en caché de lectura han caducado, vuelva a leer los datos de la base de datos.

4. Usa colas de mensajes

Al poner la operación de actualización de datos en la cola de mensajes, la base de datos se actualiza primero y luego la memoria caché se actualiza de forma asíncrona a través de la cola de mensajes para garantizar que los datos de la base de datos y la memoria caché sean coherentes. Se pueden lograr actualizaciones asincrónicas altamente confiables y de alto rendimiento a través de colas de mensajes, al tiempo que se evita la interacción directa entre el caché y la base de datos. Cabe señalar que el uso de colas de mensajes aumentará la complejidad y la demora del sistema, lo que debe sopesarse en situaciones reales.

Supongo que te gusta

Origin blog.csdn.net/qq_33129875/article/details/129468452
Recomendado
Clasificación