Del mapa de bits al filtro de floración a la estrategia de diseño de caché de alta concurrencia

mapa de bits y filtro de floración

Si hay un valor en el entero masivo --bitmap

En un programa, a menudo hay un caso que nos permite juzgar si un cierto número existe en un conjunto, en la mayoría de los casos, solo necesitamos usar una estructura de datos simple como un mapa o una lista.Si usamos un lenguaje de alto nivel , también podemos multiplicar por Express llamadas a varias API empaquetadas, agregar algunas si más, y dos o tres líneas de código pueden ver su código "perfecto" y "robusto" ejecutándose en la consola.

Sin embargo, nada es perfecto. En un entorno de alta concurrencia, todos los casos serán extremos. Si se trata de una colección muy grande (da un valor específico a esta gran cantidad, 100 millones), un mapa hash simple, independientemente de la lista enlazada El espacio de memoria de puntero requerido, 100 millones de enteros de tipo int, requiere más de 380 M (4 bytes × 10 ^ 8), y mil millones son 4 G, independientemente del rendimiento, solo calcule la sobrecarga de memoria, incluso si ahora está llena. Ground son todos los servidores 128G, y no puedo comer esta olla.

El mapa de bits utiliza la cantidad de bits para representar el tamaño del número, y el 0 o el 1 almacenado en el bit identifica si el número entero existe. El modelo específico es el siguiente:

Este es un "mapa de bits" que puede identificar 0-9, donde existen los cuatro números 4321

Calcule la sobrecarga de memoria del mapa de bits. Si se trata de una búsqueda de datos dentro de 100 millones, solo necesitamos 100 millones de bits = aproximadamente 12 MB de espacio de memoria para completar una búsqueda de datos masiva. ¿Es una reducción de memoria extremadamente atractiva? El siguiente es el código de mapa de bits implementado en Java:

public class MyBitMap {
 
    private byte[] bytes;
    private int initSize;
 
    public MyBitMap(int size) {
        if (size <= 0) {
            return;
        }
        initSize = size / (8) + 1;
        bytes = new byte[initSize];
    }
 
    public void set(int number) {
        //相当于对一个数字进行右移动3位,相当于除以8
        int index = number >> 3;
        //相当于 number % 8 获取到byte[index]的位置
        int position = number & 0x07;
        //进行|或运算  参加运算的两个对象只要有一个为1,其值为1。
        bytes[index] |= 1 << position;
    }
 
 
    public boolean contain(int number) {
        int index = number >> 3;
        int position = number & 0x07;
        return (bytes[index] & (1 << position)) != 0;
    }
 
    public static void main(String[] args) {
        MyBitMap myBitMap = new MyBitMap(32);
        myBitMap.set(30);
        myBitMap.set(13);
        myBitMap.set(24);
        System.out.println(myBitMap.contain(2));
    }
 
}

Usando matrices de bytes simples y operaciones de bits, puede lograr el equilibrio perfecto de tiempo y espacio, ¿no es hermoso, incorrecto? Imagínense, si dejamos en claro que este es un conjunto de menos de 100 millones, pero el orden de magnitud es solo 10, usamos mapa de bits, que también requiere 12 M de datos. Si es menos de 1 mil millones de datos, la sobrecarga subirá a 120M, y la sobrecarga de espacio de mapa de bits siempre está vinculada al rango de valores de sus datos. Solo con datos masivos puede mostrar sus habilidades.

Hablemos del caso extremo que acabamos de mencionar. Supongamos que la cantidad de datos es de 10 millones, pero el rango de valor está dentro de los 1000 millones. Entonces, inevitablemente, tenemos que enfrentarnos a los gastos generales de 120 millones. ¿Hay alguna forma de solucionarlo?

filtro de floración

Si nos enfrentamos a los problemas anteriores mencionados por el autor, combinemos soluciones convencionales, como hashing, haré que ciertos datos dentro de 1 billón tengan un valor dentro de 100 millones, y luego iré al mapa de bits para verificar cómo, como se muestra a continuación, el filtro Bloom hace precisamente eso:

Use los valores obtenidos por múltiples algoritmos de hash para reducir la probabilidad de colisiones de hash

Como se menciona en la leyenda anterior, podemos usar múltiples algoritmos hash para reducir la probabilidad de colisión, pero mientras haya una colisión, debe haber un juicio incorrecto. No podemos estar 100% seguros de si un valor realmente existe, pero el encanto del algoritmo hash La cuestión es que no puedo estar seguro de que existas, pero puedo estar seguro de que realmente no existes, razón por la cual la implementación anterior se llama "filtro".

Estrategia de diseño de caché de alta concurrencia

porque cache??

Si el lector es un estudiante que se especializa en ciencias de la computación, la palabra caché debe tener una frecuencia que pueda hacer que los oídos se envuelvan. En el sistema informático, la caché es un pacificador entre la CPU y la memoria, que se utiliza para reducir la brecha entre la CPU y la velocidad de procesamiento de la memoria; en el sistema operativo, la caché de página es un pacificador entre la memoria y la E/S. (Busque en la cuenta pública Java amigo íntimo, responda "2021" y le envíe una colección de preguntas de la entrevista de Java)

caché es una cosa pacífica? ? Suena raro, pero también es bastante impresionante.

Ya hablé sobre la mayor parte de la teoría de algoritmos antes, para evitar que los lectores se duerman, entraré directamente en la segunda mitad del tema, el diseño de caché de alta concurrencia.

Incluso en la capa de software, también necesitamos esa tranquilidad, comenzando con la arquitectura de servicio más simple, generalmente iniciamos una solicitud en el lado del servidor y luego CURD una base de datos relacional como Mysql. Sin embargo, una arquitectura como esta requiere un disco como terminal para la persistencia Incluso si se agrega un índice, la estructura de datos del árbol B+ se utiliza para optimizar la consulta, y la eficiencia seguirá estancada en el IO que requiere búsquedas frecuentes. En este momento, el papel de uno antiguo es muy obvio. Agregaremos algunas operaciones de memoria para aliviar la presión causada por la lenta velocidad de procesamiento de IO. el caché no es un problema, cómo usarlo es realmente un problema.

problemas de coherencia de caché

Hay varios mecanismos para el procesamiento de caché:

  • caché a un lado;
  • leer de parte a parte;
  • escriba por medio de;
  • escribir detrás del almacenamiento en caché;

problema de penetración de caché

El llamado desglose del caché significa que cuando se envía una solicitud y los datos no se pueden leer en el caché, la solicitud seguirá afectando a la base de datos. En este caso, el efecto de la descompresión del caché ya no existirá.

Imagine tal escenario, si un usuario maliciosamente y con frecuencia usa una gran cantidad de tráfico para consultar un registro que no está en la base de datos, y sigue rompiendo el caché, la base de datos está destinada a ser eliminada. caché es un problema.

Hay dos opciones. La primera es agregar un valor nulo a la caché. Si la consulta en la base de datos falla, podemos establecer el valor en nulo para evitar que se acceda a la base de datos la próxima vez. Esto es simple y conveniente, pero es un poco una pérdida de espacio. .

La segunda solución es usar un filtro bloom (punto de pregunta), agregar una capa de filtro bloom entre el caché y el servidor web, y registrar las claves a las que se accede. De esta manera, también se puede resolver el problema de la falla del caché.

problema de avalancha de caché

Una avalancha de caché ocurre cuando los cachés se invalidan al mismo tiempo en un momento determinado. Por ejemplo, el caché establece el tiempo de invalidación, lo que causará una gran cantidad de problemas de fallas de caché en la vinculación.

Agregar bloqueos distribuidos es una solución, solo la solicitud para obtener el bloqueo puede acceder a la base de datos. Sin embargo, esta es una solución temporal, cuando hay demasiadas solicitudes, una gran cantidad de subprocesos se bloquearán y la memoria se dañará.

Caliente los datos y establezca el tiempo de invalidación de forma distribuida, lo que puede reducir la probabilidad de avalanchas de caché.

Para mejorar la disponibilidad de caché, el mismo punto único de caché será un peligro oculto de avalancha de caché.La mayoría del middleware de caché proporciona una arquitectura de alta disponibilidad, como redis master-slave + arquitectura centinela.

Supongo que te gusta

Origin blog.csdn.net/m0_63437643/article/details/123733601
Recomendado
Clasificación