prefacio
He visto la implementación de caché multinivel del marco Youzan TMC antes y escribí un artículo: Consulte el principio del marco Youzan TMC para implementar el caché multinivel simplemente . Todavía no he aprendido algo de su esencia. Hoy , aprenderé más al respecto con la ayuda del JetCache de código abierto de Ali.
¿Qué es la memoria caché multinivel?
Háblame de gpt~ Esta configuración de desarrollo es un buen asistente, filtrará el contenido con más cuidado, a diferencia de cierto motor de grado que lanza directamente un montón de blogs, muchos de ellos aún son ambiguos, y la clave son los anuncios, jaja ~
Su análisis es muy detallado.La velocidad del tipo de memoria es muy rápida, pero no puede compartir recursos.La velocidad de la caché distribuida es más lenta que la anterior, pero puede garantizar la consistencia de los datos del entorno distribuido.La persistencia es generalmente el tipo de relación de mysql, y su característica es capacidad.Grande, pero la desventaja es que el rendimiento bajará cuando la concurrencia supere los 200.
Escenarios de aplicaciones de caché de varios niveles
Generalmente usamos redis de caché distribuido en nuestras aplicaciones. ¿Cuáles son sus deficiencias? También es vulnerable. Preguntas comunes de la entrevista: falla del caché, penetración del caché, estos escenarios también bloquearán el sistema y las teclas de acceso rápido también nodos, lo que afecta el rendimiento de lectura de redis y, por lo tanto, entra en juego el almacenamiento en caché de varios niveles.
Idea de caché multinivel
Lógica de lectura y escritura
lógica de almacenamiento de datos
Caché multinivel
El valor se inserta en un bucle. La capa superior es la caché local, y luego la caché distribuida. Entre ellas está CompletableFuture, que está regulada por thenCombine. Por ejemplo, si la caché local es inconsistente con la caché distribuida, un mensaje de excepción Será devuelto.
lógica de lectura de datos
El pedido todavía se lee de local a distribuido.
checkResultAndFillUpperCache(key, i, holder);
复制代码
Este código es para actualizar a la fuerza el TTL en el interior, lo que garantiza que la memoria caché interna sea consistente dentro del tiempo ttl.
garantía de consistencia
La consistencia aquí tiene varios aspectos: consistencia de caché multinivel, consistencia de diferentes nodos
¿Cómo garantiza la coherencia el almacenamiento en caché multinivel? Ven a gpt estudiantes a responder
¿Cuál es la estrategia de actualización de lectura y escritura? La estrategia de actualización de omisión es la misma que redis, es decir, cuando se obtiene get, si no hay caché de niveles múltiples, entonces el caché de niveles múltiples actualizado después de leer desde db resuelve el primer problema: la coherencia de caché de niveles múltiples.
El segundo problema: la coherencia de los diferentes nodos en realidad se resuelve mediante la publicación y suscripción de redis, es decir, las operaciones de colocación y eliminación de la clave de caché se notificarán a través de la canalización de redis, y luego se sincronizarán los diferentes nodos. Qué hacer si hay un retraso en la puerta de enlace, inténtelo de nuevo~
desglose de caché
Venga a los estudiantes de gpt para responder la pregunta nuevamente.
Debo decir que la inteligencia artificial es realmente inteligente, enumera muchos puntos y luego filtramos artificialmente lo que queremos.
El primer punto menciona que los bloqueos distribuidos se usarán para evitar la falla del caché. ¿Qué significa? Por ejemplo, si hay 2 nodos y 1w de concurrencia, entonces no hay datos en el caché multinivel. En este momento, el nodo 1 obtendrá los datos de actualización de bloqueo distribuido, otras solicitudes se atascarán primero y, una vez completada la actualización, el nodo 2 actualizará sus propios datos, por lo que incluso si la concurrencia es alta, de hecho, solo 2 solicitudes llegarán a la base de datos.
¿Cómo esperar otras solicitudes? Consulte Descarga de conteo de cercas .
Cómo monitorear las teclas del punto de acceso
estudiantes gpt:
public class HotKeyMonitor<K> implements CacheMonitor<K, Integer> {
private static final Logger logger = LoggerFactory.getLogger(HotKeyMonitor.class);
private final Map<K, AtomicInteger> counterMap = new ConcurrentHashMap<>();
private final Set<K> hotKeySet = new HashSet<>();
private final int threshold;
public HotKeyMonitor(int threshold) {
this.threshold = threshold;
}
@Override
public void onGet(String cacheName, K key, Integer value) {
if (value == null) {
return;
}
AtomicInteger counter = counterMap.computeIfAbsent(key, k -> new AtomicInteger());
if (counter.incrementAndGet() >= threshold) {
synchronized (hotKeySet) {
if (!hotKeySet.contains(key)) {
hotKeySet.add(key);
![]()logger.info("Hot key detected, cache: {}, key: {}, count: {}", cacheName, key, counter.get());
}
}
}
}
@Override
public void onPut(String cacheName, K key, Integer value) {
counterMap.remove(key);
synchronized (hotKeySet) {
hotKeySet.remove(key);
}
}
public Set<K> getHotKeySet() {
synchronized (hotKeySet) {
return new HashSet<>(hotKeySet);
}
}
}
复制代码
¿Cómo se actualiza este valor?
¿Se sincronizará este monitoreo en el clúster?
¿De qué manera lo monitorea?
La solicitud onGet se acumulará y onPut eliminará la tecla de acceso rápido a través del evento de forma asíncrona
Después de monitorear la clave del punto de acceso, en realidad se debe colocar en el caché local para acceder a ella, que es lo más eficiente y evita las solicitudes de red Redis, especialmente el problema de la clave grande .
Resumir
Aquí comenzamos desde el concepto de caché multinivel hasta por qué usamos caché multinivel, y luego desde su lógica de lectura y escritura, garantía de consistencia, desglose de caché, monitoreo de teclas de acceso rápido, tenemos una comprensión integral de caché multinivel I entiendo, gracias a la respuesta de chatgpt, y también leí el código fuente correspondiente, espero que sea útil para los lectores ~
Este artículo participa en el Programa de apoyo al creador de inteligencia artificial.