[Alta concurrencia] ¿Cómo construir caché a nivel de aplicación en un entorno de alta concurrencia?

Escribir en frente

A medida que la carga de nuestro sistema sea cada vez mayor, el rendimiento del sistema disminuirá, en este momento, naturalmente, podemos pensar en usar caché para resolver el problema del bajo rendimiento de lectura y escritura de datos. Sin embargo, si está decidido a convertirse en un arquitecto senior, ¿puede construir un caché a nivel de aplicación de manera razonable y eficiente en un entorno de alta concurrencia?

Proporción de aciertos de caché

La tasa de aciertos de la memoria caché es la relación entre el número de lecturas de datos de la memoria caché y el número total de lecturas. Cuanto mayor sea la tasa de aciertos, mejor. Porcentaje de aciertos de caché = número de lecturas del caché / (número total de lecturas (número de lecturas del caché + número de lecturas de dispositivos lentos)). Este es un indicador de monitoreo muy importante. Si realiza el almacenamiento en caché, debe monitorear este indicador para ver si el caché funciona bien.

Estrategia de reciclaje de caché

1. Basado en el espacio

Basado en el espacio significa que el caché está configurado con espacio de almacenamiento, como 10 MB, cuando se alcanza el límite de espacio de almacenamiento, los datos se eliminan de acuerdo con una determinada estrategia.

2. Basado en la capacidad

Según la capacidad, se establece el tamaño máximo de la memoria caché. Cuando la entrada de la memoria caché excede el tamaño máximo, los datos antiguos se eliminan de acuerdo con una determinada estrategia.

3. Basado en el tiempo

TTL (Time To Live): período de supervivencia, es decir, un período de tiempo desde el momento en que se crean los datos en caché hasta que caducan (independientemente de si se accede a ellos dentro de este período de tiempo, los datos en caché caducarán)
TTI (Tiempo de inactividad): período de inactividad, es decir, el tiempo cuando no se ha accedido a los datos almacenados en caché antes de que se elimine el caché.

4. Basado en referencias de objetos

Referencia flexible: si un objeto es una referencia flexible, cuando la memoria del montón JVM es insuficiente, el recolector de basura puede reclamar estos objetos. Las referencias suaves son adecuadas para el almacenamiento en caché, de modo que cuando la memoria de almacenamiento dinámico de JVM es insuficiente, estos objetos se pueden recuperar para hacer espacio para objetos de referencia fuertes, evitando así la OOM.
Referencia débil: cuando el recolector de basura recupera memoria, si se encuentra una referencia débil, se recuperará de inmediato. En comparación con las referencias suaves, las referencias débiles tienen un ciclo de vida más corto.

Nota: Solo cuando ningún otro objeto de referencia fuerte se refiere al objeto de referencia débil / referencia suave, la referencia se recopilará durante la recolección de basura. Es decir, si un objeto (no un objeto de referencia débil / referencia débil) hace referencia a un objeto de referencia débil / referencia suave, el objeto de referencia débil / referencia suave no se recolectará durante la recolección de basura.

5. Algoritmo de reciclaje

El uso de cachés basados ​​en el espacio y en la capacidad utiliza ciertas estrategias para eliminar datos antiguos. Las comunes son las siguientes.

  • FIFO (Primero en entrar, primero en salir): algoritmo de primero en entrar, primero en salir, es decir, el primero que se coloca en la caché se elimina primero.
  • LRU (menos utilizado recientemente): el algoritmo utilizado menos recientemente, se elimina el que tiene el tiempo y el tiempo más largos.
  • LFU (menos utilizado con frecuencia): se elimina el algoritmo menos utilizado, el que tiene el menor número de usos (frecuencia) dentro de un cierto período de tiempo.

En aplicaciones prácticas, se utilizan la mayoría de los cachés basados ​​en LRU.

Tipo de caché

Memoria de almacenamiento dinámico : utilice la memoria de almacenamiento dinámico de Java para almacenar objetos. La ventaja de usar la memoria caché de almacenamiento dinámico es que no hay serialización / deserialización y es la memoria caché más rápida. La desventaja también es obvia: cuando la cantidad de datos en caché es grande, el tiempo de pausa del GC (recolección de basura) se hará más largo y la capacidad de almacenamiento estará limitada por el tamaño del espacio de almacenamiento dinámico. Los objetos de caché generalmente se almacenan a través de referencias suaves / referencias débiles. Es decir, cuando la memoria de almacenamiento dinámico es insuficiente, esta parte de la memoria se puede recuperar a la fuerza para liberar espacio en la memoria de almacenamiento dinámico. Las memorias caché de almacenamiento dinámico se utilizan generalmente para almacenar datos activos. Puede usar Guava Cache, Ehcache 3.x, MapDB para lograr.

Memoria fuera del montón: es decir, los datos almacenados en caché se almacenan en la memoria fuera del montón, lo que puede reducir el tiempo de pausa del GC (los objetos del montón se transfieren fuera del montón, el escaneo del GC y los objetos en movimiento disminuyen), puede admitir más espacio en el caché (solo se ve afectado por el tamaño de la memoria de la máquina Límite, no afectado por el espacio de almacenamiento dinámico). Sin embargo, se requiere serialización / deserialización al leer datos. Por lo tanto, será mucho más lento que la memoria caché del montón. Puede usar Ehcache 3.x, MapDB para lograr.

Caché de disco: es decir, los datos almacenados en caché se almacenan en el disco, y los datos aún existen cuando se reinicia la JVM, y los datos de caché de almacenamiento dinámico / desactivado se perderán y deberán volver a cargarse. Puede usar Ehcache 3.x, MapDB.

Caché distribuido: el caché distribuido puede usar ehcache-clustered (con el servidor Terracotta) para lograr un caché distribuido entre los procesos de Java. También puedes usar Memcached y Redis.

Modo de caché

Modo autónomo: almacene los datos más calientes en la memoria caché del montón, datos relativamente calientes en la caché fuera del montón y datos no calientes en la caché del disco.
Modo de clúster: almacene los datos más actuales en la memoria caché de almacenamiento dinámico, datos relativamente importantes en la memoria caché externa y la cantidad total de datos en la memoria caché distribuida.

Escribe al final

Si el artículo le resulta útil, busque y siga la cuenta de WeChat de " Binghe Technology " en WeChat, y aprenda técnicas de programación de alta concurrencia con Binghe

Finalmente, adjunte el mapa de conocimiento de habilidades básicas que la programación concurrente necesita dominar. Deseo que todos eviten desvíos cuando aprendan programación concurrente.
Inserte la descripción de la imagen aquí

Se publicaron 1356 artículos originales · 2387 elogios · 5.44 millones de visitas

Supongo que te gusta

Origin blog.csdn.net/l1028386804/article/details/105546816
Recomendado
Clasificación