[redis] Coherencia entre el caché de redis y la base de datos

[1] Cuatro estrategias de sincronización

Para asegurarse de que la memoria caché y la base de datos se escriben dos veces de forma coherente, existen 4 métodos, a saber, 4 estrategias de sincronización:
(1) primero actualice la memoria caché y luego actualice la base de datos;
(2) primero actualice la base de datos y luego actualice la caché;
(3) elimine primero el caché y luego actualice la base de datos;
(4) actualice primero la base de datos y luego elimine el caché.

¿Qué es más apropiado para actualizar el caché o eliminar el caché? ¿Debe operarse primero la base de datos o primero el caché?

【2】Actualizar caché o eliminar caché

(1) Actualizar caché

(1) Ventajas
El caché se actualiza a tiempo para cada cambio de datos, por lo que no es fácil pasarlo por alto al consultar.

(2) Desventajas
El consumo de actualizar el caché es relativamente grande. Si es necesario escribir los datos en la memoria caché después de cálculos complejos, las actualizaciones frecuentes de la memoria caché afectarán el rendimiento del servidor. Si se trata de un escenario comercial en el que los datos se escriben con frecuencia, es posible que no sea un negocio leer los datos cuando la memoria caché se actualiza con frecuencia.

(2) Eliminar el caché

(1) Ventajas
La operación es simple, no importa si la operación de actualización es complicada o no, los datos en el caché se eliminan directamente.

(2) Desventajas
Después de eliminar la memoria caché, la siguiente memoria caché de consulta se perderá y será necesario volver a leer la base de datos. De la comparación anterior, en general, eliminar el caché es una mejor solución.

[3] Primero actualice la base de datos o elimine primero el caché

(1) Cuando ocurre una falla

Primero, primero eliminaremos el caché y primero actualizaremos la base de datos, y haremos una comparación cuando haya una falla:

1- Primero elimine el caché, luego actualice la base de datos (falló la actualización de la base de datos)

Elimine el caché primero y luego actualice la base de datos. Posibles problemas en caso de falla:
(1) el subproceso A elimina el caché con éxito, pero el subproceso A falla al actualizar la base de datos;
(2) el subproceso B lee los datos del caché; porque el caché se elimina, proceso B Los datos no se pueden obtener de la memoria caché y luego leerlos de la base de datos; en este momento, la actualización de datos en la base de datos falla y el subproceso B obtiene con éxito los datos antiguos de la base de datos y luego actualiza los datos al caché.
(3) Al final, los datos de la caché y la base de datos son consistentes, pero siguen siendo datos antiguos.

inserte la descripción de la imagen aquí

2-Actualice la base de datos primero, luego elimine el caché (eliminar el caché falló)

Primero actualice la base de datos y luego elimine el caché. Posibles problemas en caso de falla:
(1) el subproceso A actualiza correctamente la base de datos, pero el subproceso A no puede eliminar el caché;
(2) el subproceso B lee el caché con éxito, pero debido a que el caché la eliminación falla, el subproceso B lee Lo que se obtiene son los datos antiguos en el caché.
(3) Finalmente, el subproceso A elimina el caché con éxito y otros subprocesos acceden a los mismos datos en el caché, que son los mismos que los datos en la base de datos.
(4) Al final, la caché y los datos de la base de datos son consistentes, pero algunos subprocesos leerán datos antiguos.

inserte la descripción de la imagen aquí

3- Resumen

Después de la comparación anterior, encontramos que cuando ocurre una falla, es imposible distinguir claramente qué método es mejor para eliminar primero el caché o actualizar primero la base de datos, pensando que hay problemas en ambos. ¿Cómo resolver los problemas en los escenarios anteriores? Se recomienda utilizar el mecanismo de reintento para solucionarlo.

(2) Cuando no hay falla

1- Elimine el caché primero, luego actualice la base de datos

(1) el subproceso A elimina la caché con éxito;
(2) el subproceso B no puede leer la caché;
(3) el subproceso B lee con éxito la base de datos y obtiene los datos antiguos;
(4) el subproceso B actualiza correctamente los datos antiguos en la caché;
( 5) El subproceso A actualiza con éxito los nuevos datos en la base de datos.
inserte la descripción de la imagen aquíSe puede ver que las operaciones de dos pasos del proceso A son exitosas, pero debido a la existencia de concurrencia, el proceso B ha accedido al caché entre estos dos pasos. El resultado final es que los datos antiguos se almacenan en la memoria caché y los datos nuevos se almacenan en la base de datos, y los datos entre los dos son inconsistentes.

La eliminación doble retrasada resuelve este problema

Si primero se elimina la memoria caché y luego se actualiza la base de datos, es posible que se produzcan incoherencias en los datos si no se produce ningún error. Si en aplicaciones prácticas, necesitamos elegir este método debido a algunas consideraciones, podemos adoptar la estrategia de doble borrado diferido.La idea básica del doble borrado diferido es la siguiente: (1) eliminar el caché; (2)
actualizar
la base de datos;
(3) dormir durante N milisegundos;
(4) eliminar el caché nuevamente.

public void write(String key, Object data) {
    
    
    Redis.delKey(key);
    db.updateData(data);
    Thread.sleep(1000);
    Redis.delKey(key);
}

Después de bloquear durante un período de tiempo, elimine el caché nuevamente para eliminar los datos inconsistentes en el caché durante este proceso. En cuanto al tiempo específico, debe evaluar el tiempo aproximado de su negocio y configurarlo de acuerdo con este tiempo. Finalmente, la consistencia de datos entre la base de datos y el caché está garantizada.

Y si es una arquitectura con separación lectura-escritura (lectura obligatoria de la biblioteca principal)

Si la base de datos adopta una arquitectura de separación de lectura y escritura, surgirán nuevos problemas, como se muestra en la siguiente figura:
En este momento, hay dos solicitudes, solicitud A (operación de actualización) y solicitud B (operación de consulta)
(1) Solicitud A operación de actualización, Redis eliminado;
(2) Solicite a la base de datos maestra que realice una operación de actualización, y la base de datos maestra y la base de datos esclava sincronizarán los datos; (
3) Pida a B que consulte y descubra que no hay datos en Redis;
(4 ) Tómelo de la base de datos esclava (5) En este momento,
los datos de sincronización maestro-esclavo no se han completado y los datos obtenidos son datos antiguos;

inserte la descripción de la imagen aquí
La solución en este momento es obligar a Redis a apuntar a la base de datos principal para consultar si es para consultar la base de datos para completar datos.

¿Qué debo hacer si la eliminación falla?

Si la eliminación sigue fallando, puede aumentar el número de reintentos, pero este número debe ser limitado. Cuando el número supera cierto número, debe tomar medidas como informar errores, iniciar sesión y enviar recordatorios por correo electrónico.

2-Actualice primero la base de datos, luego elimine el caché (solución óptima)

(1) El subproceso A actualiza con éxito la base de datos;
(2) El subproceso B lee la caché con éxito;
(3) El subproceso A elimina la caché con éxito.
inserte la descripción de la imagen aquí
Se puede ver que los datos finales de la caché y la base de datos son consistentes y son los datos más recientes. Pero el subproceso B lee datos antiguos durante este proceso, y puede haber otros subprocesos como el subproceso B que leen datos antiguos en el caché entre estos dos pasos, pero debido a que la velocidad de ejecución de estos dos pasos será más rápida, entonces no importa mucho. Después de estos dos pasos, cuando otros procesos lean los datos almacenados en caché, no habrá problemas similares al proceso B.

Compensación por eliminaciones usando colas de mensajes

También habrá problemas en el caso de actualizar primero la base de datos y luego eliminar la caché. Por ejemplo, la actualización de la base de datos es exitosa, pero ocurre un error durante la eliminación de la caché y la eliminación no es exitosa. Luego, cuando la caché se lee de nuevo en este momento, los datos son incorrectos cada vez.

La solución en este punto es utilizar colas de mensajes para compensar las eliminaciones. La lógica comercial específica se describe en el siguiente lenguaje:
(1) Solicite el subproceso A para actualizar la base de datos primero;
(2) Se informa un error al eliminar Redis y la eliminación falla;
(3) En este momento, la clave de Redis se utiliza como El cuerpo del mensaje se envía a la cola de mensajes;
(4) El sistema elimina Redis nuevamente después de recibir el mensaje enviado por la cola de mensajes;

inserte la descripción de la imagen aquíSin embargo, esta solución tiene la desventaja de que causará una gran intrusión en el código comercial y estará profundamente acoplada, por lo que habrá un método de optimización en este momento. Sabemos que después de la operación de actualización en la base de datos Mysql, agréguelo al registro binlog, puede encontrar la operación correspondiente, luego podemos suscribirnos al registro binlog de la base de datos Mysql para operar el caché.

【4】Resumen

En circunstancias normales, eliminar el caché es una mejor solución que actualizar el caché; actualizar primero la base de datos es una mejor solución que eliminar primero el caché; en general, [actualizar primero la base de datos, luego eliminar el caché] es la que menos impacto tiene de las cuatro. estrategias, el efecto solución óptima.

Sin embargo, si necesita usar la solución de [eliminar el caché primero, luego actualizar la base de datos], puede usar [eliminación doble retrasada] [obligado a leer la biblioteca principal cuando la lectura y la escritura están separadas] [mecanismo de reintento] para resolver el problema.

Si no puede eliminar el caché cuando usa [actualizar primero la base de datos, luego eliminar el caché], puede usar [sincronización de binlog para redis] para resolver el problema.

Supongo que te gusta

Origin blog.csdn.net/weixin_44823875/article/details/129051198
Recomendado
Clasificación