[Alta simultaneidad] Entrevistador: ¿Cuáles son los problemas que más preocupan al almacenamiento en caché? ¿Cuáles son los tipos? ¿Estrategias y algoritmos de reciclaje?

Escribir al frente

Cuando inicia un proyecto, no piensa demasiado en los problemas de rendimiento y se centra en la iteración rápida. Con el rápido desarrollo de los negocios en el futuro, el rendimiento del sistema es cada vez más lento. En este momento, el sistema debe optimizarse en consecuencia, y el efecto más significativo es agregar un caché al sistema. Entonces, aquí viene la pregunta: cuando agrega un caché al sistema, ¿ha considerado a qué debe prestar atención al usar el caché?

Tasa de aciertos de caché

La tasa de aciertos de la caché es la relación entre el número de veces que se leen los datos de la memoria caché y el número total de lecturas. Cuanto mayor sea la tasa de aciertos, mejor. Tasa de aciertos del 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 está almacenando en caché, debe monitorear este indicador para ver si el caché está funcionando bien.

Tipo de caché

En términos generales, los tipos de caché se pueden dividir en: caché de pila, caché fuera de pila, caché de disco y caché distribuida.

Inserte la descripción de la imagen aquí

Memoria del montón

Utilice la memoria del montón de Java para almacenar objetos. La ventaja de usar la caché de pila es que no hay serialización / deserialización y es la caché más rápida. La desventaja también es obvia: cuando la cantidad de datos almacenados en caché es grande, el tiempo de pausa de GC (recolección de basura) será más largo y la capacidad de almacenamiento está limitada por el tamaño del espacio del montón. Generalmente, los objetos de la caché se almacenan a través de referencias suaves / referencias débiles. Es decir, cuando la memoria del montón es insuficiente, esta parte de la memoria se puede recuperar a la fuerza para liberar el espacio de la memoria del montón. Generalmente, utilice la memoria caché de pila para almacenar datos activos. Se puede implementar usando Guava Cache, Ehcache 3.xy MapDB.

Memoria fuera del montón

Es decir, los datos de la 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 mueven fuera del montón y el GC escanea y mueve menos objetos), y puede admitir más espacio de caché (solo limitado por el tamaño de la memoria de la máquina, no El impacto del espacio de pila). Sin embargo, se requiere serialización / deserialización al leer datos. Por lo tanto, será mucho más lento que el caché del montón. Puede usar Ehcache 3.x, MapDB para lograrlo.

Caché de disco

Es decir, los datos de la caché se almacenan en el disco y los datos aún existen cuando se reinicia la JVM, pero los datos de la caché de pila / fuera de pila se perderán y deberán volver a cargarse. Puede usar Ehcache 3.x, MapDB para lograrlo.

Caché distribuida

La caché distribuida puede usar ehcache-clustered (con el servidor Terracotta) para realizar la caché distribuida entre procesos de Java. También se puede implementar usando Memcached y Redis.

Cuando se usa la caché distribuida, hay dos modos de la siguiente manera:

  • Modo autónomo: almacene los datos más activos en el caché del montón, los datos relativamente activos en el caché fuera del montón y los datos no activos en el caché del disco.
  • Modo de clúster: almacene los datos más activos en la memoria caché del montón, los datos relativamente activos en la memoria caché externa y todos los datos en la memoria caché distribuida.

Estrategia de recuperación de caché

La estrategia de recuperación de caché generalmente incluye: estrategia de recuperación basada en el espacio, estrategia de recuperación basada en la capacidad (espacio), estrategia de recuperación basada en el tiempo y estrategia de recuperación basada en la referencia de objetos.
Inserte la descripción de la imagen aquí

Basado en el espacio

Basado en el espacio se refiere al espacio de almacenamiento de la configuración de la caché, por ejemplo, establecido en 10 MB, cuando se alcanza el límite superior del espacio de almacenamiento, los datos se eliminan de acuerdo con una estrategia determinada.

Basado en capacidad

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

Basado en el tiempo

TTL (Time To Live): tiempo de vida, es decir, un período de tiempo desde la creación de los datos en caché hasta que caducan (los datos en caché caducarán independientemente de si se accede a ellos durante este período de tiempo).
TTI (Time To Idle): período de inactividad, es decir, cuánto tiempo no se ha accedido a los datos almacenados en caché antes de eliminar el caché.

Referencia basada en objetos

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

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

Algoritmo de recuperación

El uso de cachés basados ​​en el espacio y en la capacidad utilizará ciertas estrategias para eliminar datos antiguos, que generalmente incluyen: algoritmo FIFO, algoritmo LRU y algoritmo LFU.
Inserte la descripción de la imagen aquí

  • FIFO (Primero en entrar, primero en salir): algoritmo de primero en entrar, primero en salir, es decir, los que se colocan primero en el búfer se eliminan primero.
  • LRU (menos utilizado recientemente): se elimina el algoritmo utilizado menos recientemente, el que tiene la distancia de tiempo más larga a partir de ahora.
  • LFU (menos utilizado): se elimina el algoritmo menos utilizado, el que menos se utiliza (frecuencia) dentro de un cierto período de tiempo.

En aplicaciones prácticas, las cachés basadas en LRU son en su mayoría.

Bueno, ¡hablemos de eso hoy! ¡No olvides darle me gusta, dárselo a alguien que lo esté viendo y reenviarlo, para que más personas puedan verlo, aprender juntos y progresar juntos! !

Supongo que te gusta

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