Principio de Redis - estrategia de memoria

La dirección del texto original se actualiza y el efecto de lectura es mejor.

Principio de Redis: estrategia de memoria | Mástil de programación de CoderMast icono-predeterminado.png?t=N5K3https://www.codermast.com/database/redis/redis-memery-strategy.html

Redis en sí es una base de datos típica de almacenamiento de memoria de clave-valor, por lo que todas las claves y valores se almacenan en la estructura Dict aprendida previamente. Sin embargo, en su estructura de base de datos, hay dos Dict: uno se usa para registrar clave-valor; el otro se usa para registrar clave-TTL

typedef struct redisDb {
    dict *dict;     // 存放所有 key 和 value 的地方
    dict *expires;  // 存放每一个 key 及其对应的 TTL 存活时间,只包含设置了 TTL 的 key
    dict *blocking_keys;   
    dict *ready_keys;
    dict *watched_keys;
    int id;         // Database ID :0 ~ 15
    long long avg_ttl;  
    unsigned long expires_cursor;   // expire 检查时在 dict 中抽样的索引位置
    list *defrag_later; // 等待碎片整理的 key 列表
} redisDb;

¿Cómo sabe Redis si una clave ha caducado?

Respuesta: use dos dictados para registrar valor-clave y clave-ttl respectivamente

¿Se elimina inmediatamente cuando caduca el TTL?

Respuesta: No se elimina inmediatamente cuando caduca, pero  se adoptan la eliminación perezosa  y  la eliminación periódica .

#eliminar estrategia

  • Eliminación programada: después de que expire el TTL, elimine la clave correspondiente inmediatamente

  • Eliminación diferida: no se elimina inmediatamente después de que caduca el TTL, pero cuando se accede a una clave, se verifica el tiempo de supervivencia de la clave y la eliminación se realiza solo si ha caducado.

  • Eliminación periódica: utiliza una tarea programada para probar periódicamente algunas claves caducadas y luego eliminarlas. Hay dos ciclos de ejecución:

    • Redis configurará una tarea de temporización serverCron() para realizar la limpieza de claves caducadas de acuerdo con la frecuencia de server.hz, el modo es LENTO y el valor predeterminado es 10
    • Se llamará a la función beforeSleep() antes de cada ciclo de eventos de Redis para realizar la limpieza de claves caducadas, y el modo es RÁPIDO

Reglas del modo LENTO:

  1. La frecuencia de ejecución se ve afectada por server.hz, y el valor predeterminado es 10, es decir, se ejecuta 10 veces por segundo y cada ciclo de ejecución es de 100 ms.

  2. La ejecución de la limpieza no requiere más del 25 % de un ciclo de ejecución.

  3. Recorriendo la base de datos uno por uno, recorriendo los cubos en la base de datos uno por uno, extrayendo 20 claves para determinar si han expirado

  4. Si no se alcanza el límite de tiempo (25ms) y la proporción de claves caducadas es superior al 10%, se realiza otro muestreo, de lo contrario finaliza

Reglas del modo FAST (no se ejecutan si la proporción de claves caducadas es inferior al 10 %)

  1. La frecuencia de ejecución se ve afectada por la frecuencia de llamada de beforeSleep(), pero el intervalo entre dos modos FAST no es inferior a 2 ms
  2. Realizar la limpieza no lleva más de 1 ms
  3. Recorriendo la base de datos uno por uno, recorriendo los cubos en la base de datos uno por uno, extrayendo 20 claves para determinar si han expirado
  4. Si no se alcanza el límite de tiempo (1ms) y la proporción de claves caducadas es superior al 10%, se realiza otro muestreo, de lo contrario finaliza

#estrategia de eliminación

La eliminación de memoria es el proceso en el que Redis selecciona y elimina activamente algunas claves para liberar más memoria cuando el uso de memoria de Redis alcanza el umbral establecido. Redis intentará eliminar la memoria en el método processCommand() que procesa los comandos del cliente.

Redis admite un total de 8 estrategias de eliminación

  • noeviction: cuando el uso de la memoria supera la configuración, se devolverá un error y no se desalojarán las claves.

  • allkeys-lru: al agregar una clave, si se excede el límite, la clave que no se ha utilizado durante más tiempo se desaloja primero a través del algoritmo LRU.

  • volatile-lru: si se excede el límite al agregar una clave, la clave que no se ha utilizado durante más tiempo se expulsa primero del conjunto de claves con un tiempo de caducidad establecido.

  • allkeys-random: si se supera el límite al agregar una clave, se eliminará aleatoriamente de todas las claves.

  • volatile-random: si se supera el límite al agregar una clave, se expulsará aleatoriamente de la colección de claves caducadas.

  • volatile-ttl: desalojar las claves que están a punto de caducar de las claves configuradas con un tiempo de caducidad.

  • volatile-lfu: desaloje la clave utilizada con menos frecuencia de todas las claves configuradas con un tiempo de caducidad.

  • allkeys-lfu: desaloje la clave utilizada con menos frecuencia de todas las claves.

LRU (Least Recent Used): El menos recientemente utilizado, la hora actual menos la última hora de acceso, cuanto mayor sea el valor, mayor será la prioridad de eliminación.

LFU (Least Frequently Used): La menos utilizada, contará la frecuencia de acceso de cada clave, cuanto menor sea el valor, mayor será la prioridad de eliminación.

typedef struct redisObject(

    unsigned type:4;//对象类型
    unsigned encoding:4;// 编码方式
    unsigned lru:LRU_BITS;
    //LRU: 以秒为单位记录最近一次访问时间,长度24bit
    //LFU: 高16位以分钟为单位记录最近一次访问时间,低8位记录逻辑访问次数
    int refcount;   // 引用计数,计数为0则可以回收
    void *ptr;      // 数据指针,指向真实数据
) robj;

El número de accesos LRU se denomina número de accesos lógicos porque no se cuenta cada vez que se accede a una clave, sino por cálculo:

  1. Generar un número aleatorio R entre 0 y 1
  2. Calcule 1 / (viejos tiempos * lfu_log_factor + 1), inicie sesión en R, lfu_log_factor por defecto es 10
  3. Si R < P, entonces el contador + 1, y el máximo no excede 255
  4. El número de visitas disminuirá con el tiempo, cada lfu_decay_time minutos (predeterminado 1) desde la hora de la última visita, contador -1

Supongo que te gusta

Origin blog.csdn.net/qq_33685334/article/details/131345693
Recomendado
Clasificación