Redis (4) de la ruta de crecimiento de los simios del programa: Introducción al tipo de cadena de la estructura de datos de Redis

Prefacio
Los estudiantes que han estudiado Java deben saber que cadena se refiere principalmente al tipo de cadena en el lenguaje Java, y esto no pertenece a los tipos de datos básicos de Java. Y en redis, ¿cuál es el tipo de cadena? ¿Cuáles son sus escenarios de uso comunes? ¿Cuáles son los comandos comunes?

¿Cuál es el tipo de cadena de redis?

El tipo String consta de dos partes en Redis, una parte es la clave, que es la clave, y la otra parte es el valor, que es el valor. Redis vincula la clave y el valor, y encuentra el valor del valor a través la clave.

Escenarios de uso de tipo String

  1. Se utiliza para almacenar datos como sesiones compartidas y códigos de verificación que requieren configuraciones de tiempo de espera.
    Setex session_key 7200 session_value // Configurado para caducar después de dos horas (2 * 60 * 60), en segundos
  2. Se utiliza para almacenar cadenas json (objetos serializados), como información de productos básicos, información de usuario, etc.
    Mset key1 userinfo1 key2 userinfo2
  3. Se utiliza para configurar el bloqueo distribuido
    setnx nombre de bloqueo valor de bloqueo
  4. contar
    establecer contador 1
    contador incr

cadena Comandos de uso común: (redis)

  1. agregar valor de clave // ​​Si la clave ya existe, el comando APPEND agregará los datos del parámetro Valor al final del Valor existente. Si la clave no existe, el comando APPEND creará una nueva clave/valor y el valor de retorno es la longitud del nuevo valor.
  2. Tecla incr/decr //Datos atómicos más/menos
  3. tecla incrby/decrby nb // datos atómicos más/menos nb
  4. obtener clave //obtener datos
  5. establecer el valor de la clave // ​​almacenar datos, si la clave ya existe, sobrescribe su valor original
  6. clave strlen // longitud del valor
  7. valor de segundos de clave setex // Complete atómicamente dos operaciones, una es establecer el valor de la clave en una cadena específica y, al mismo tiempo, establecer el tiempo de supervivencia (en segundos) de la clave en el servidor Redis.
  8. valor de clave setnx // almacenar valor si la clave no existe
  9. mget key1 [key2…] // Obtener el valor de key1 y key2
  10. mset clave1 valor1 [clave2 valor2 ...] //Establecer valor1, valor2

¿Mecanismo de asignación de memoria dinámica del tipo de cadena Redis? (extendido)

Las cadenas en redis asignan memoria dinámicamente. La implementación de la estructura interna es similar a ArrayList de Java (expande dinámicamente la longitud de la matriz de acuerdo con el factor de carga y la longitud máxima real). Hay otra regla: si la longitud de la cadena es inferior a 1 M, utilice el método de expansión duplicada, y si el tamaño supera 1 M, amplíe la capacidad a 1 M. Pero si la longitud total de la cuerda no puede exceder los 512 M.
Dado que redis se desarrolla en base al lenguaje C, podemos usar la estructura (struct) en lenguaje C para describir, y la estructura se denomina sds.
Struct SDS { T len; // Longitud de datos existente T alloc; // Capacidad de matriz Char flags; // Bandera especial Char[] buff; //Almacenar cadena };




¿Por qué está configurado así?

  1. alloc: reduce la complejidad de la expansión de la matriz.
    Para Java, podemos usar length para obtener la longitud de la matriz al expandir la matriz, pero no en lenguaje C. Cada vez que asignamos memoria, usaremos void *malloc(size) o método void *calloc(size ) para asignar, pero obviamente debemos pasar la longitud de la dirección que debe asignarse. Por tanto, este diseño se puede ampliar más rápidamente. La complejidad del tiempo es O (1).
  2. Len: garantiza la integridad de los datos sin truncarlos.
    Si la cadena guarda archivos binarios como imágenes y videos, puede haber un carácter "0" en el medio. Todo el mundo sabe que una vez que se lee el carácter "0", dejará de leerse. Por lo tanto, aquí se agrega la longitud de los datos existentes para garantizar la integridad del truncamiento de datos.
    Además, se puede utilizar junto con la capacidad para reducir la asignación frecuente de memoria. Para SDS, al agregar cadenas (comando agregar), el programa usará alloc-len para comparar si la memoria libre restante es suficiente para asignar contenido adicional; si no es suficiente, naturalmente activará la reasignación de memoria y si la memoria restante no utilizada Si hay suficiente espacio para guardarlo, se asignará directamente sin reasignación de memoria. Su estrategia de expansión es que cuando el tamaño de la cadena es menor a 1M, cada asignación es len * 2, es decir, se reserva el 100% de redundancia; después de que es mayor a 1M, para evitar desperdicio, solo se reserva 1M más de espacio. asignado, y el máximo no supera los 512M.

  3. Banderas: determina qué estructura sds se usa
    para almacenar datos.
    #define SDS_TYPE_8 1 // Los primeros tres dígitos de la bandera son 001, lo que indica que la estructura sdshdr8 se usa para almacenar datos
    #define SDS_TYPE_16 2 // La primera. tres dígitos de la bandera son 010, lo que indica que la estructura sdshdr16 se usa para almacenar datos
    #define SDS_TYPE_32 3 // Los primeros tres dígitos de la bandera son 011, lo que indica que la estructura sdshdr32 se usa para almacenar datos
    #define SDS_TYPE_64 4 // Los primeros tres dígitos de la bandera son 100, lo que indica que la estructura sdshdr64 se utiliza para almacenar datos,
    de esta manera se puede seleccionar la estructura más adecuada para almacenar datos y mejorar la optimización de la memoria.
    Hay cinco tipos de sdshdr (la estructura descrita anteriormente) en el código fuente sds.h en Redis, que son los siguientes (los siguientes son todos los códigos fuente):
struct __attribute__ ((__packed__)) sdshdr5 {
    
    
    unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
    
    
    uint8_t len; /* used */
    uint8_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
    
    
    uint16_t len; /* used */
    uint16_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
    
    
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
    
    
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

El modelo de memoria es el siguiente:
inserte la descripción de la imagen aquí

Nota: donde len representa la longitud real de la matriz y alloc representa la longitud de la asignación de la matriz. El primer tipo no puede expandir automáticamente la longitud de la matriz debido a la ausencia de len y alloc. Una vez que se agota la dirección preasignada , el espacio de memoria debe reasignarse y completarse. La replicación de datos consume mucho rendimiento, por lo que rara vez se utiliza.

más enlaces

Instalación de Redis https://blog.csdn.net/qq_31236027/article/details/121879741
introducción de redis https://blog.csdn.net/qq_31236027/article/details/121879604
introducción de la estructura de datos de redis https://blog.csdn. net/qq_31236027/article/details/121894713

Supongo que te gusta

Origin blog.csdn.net/qq_31236027/article/details/122016881
Recomendado
Clasificación