Redis (tres) estructura de datos Hash hash

Introducción a un objeto hash

  1. Casi todos los lenguajes de programación proporcionan tipos de hash, que pueden denominarse hash, diccionarios y matrices asociativas;
  2. Picadillo

En Redis, el tipo de hash se refiere al valor clave en sí mismo es una estructura de par clave-valor, como valor = { {campo1, valor1}, ... {campoN, valorN}}, tanto del par clave-valor de Redis como el tipo de hash La relación se puede representar mediante la siguiente figura
Inserte la descripción de la imagen aquí

Dos comandos de uso común

Ordene a la mejor persona que lo golpee.

Tres, codificación interna

Hay dos tipos de codificación interna para los tipos de hash:

  1. ziplist (lista comprimida): cuando el número de elementos de tipo hash es menor que la configuración hash-max-ziplist-entries (predeterminado 512), y todos los valores son menores que la configuración hash-max-ziplist-value (predeterminado 64 bytes), Redis usará ziplist como la implementación interna de hash, ziplist usa una estructura más compacta para lograr el almacenamiento continuo de múltiples elementos, por lo que es mejor que hashtable en términos de ahorro de memoria
  2. Hashtable (tabla hash): cuando el tipo de hash no puede cumplir con las condiciones de la lista zip, Redis usará la tabla hash como la implementación interna del hash, porque en este momento la eficiencia de lectura y escritura de la lista zip disminuirá, y la lectura y La complejidad del tiempo de escritura de la tabla hash es O (1)

Inserte la descripción de la imagen aquí
Diferencias específicas ver dos códigos de entendimiento

Estructura de cuatro datos

dictht es una estructura de tabla hash que utiliza el método zipper para almacenar el dictEntry de los conflictos hash.

typedef struct dictht{
    
    
    //哈希表数组
    dictEntry **table;
    //哈希表大小
    unsigned long size;
    //哈希表大小掩码,用于计算索引值
    unsigned long sizemask;
    //该哈希表已有节点的数量
    unsigned long used;
}
 
typedef struct dictEntry{
    
    
    //键
    void *key;
    //值
    union{
    
    
        void *val;
        uint64_tu64;
        int64_ts64;
    }
    struct dictEntry *next;
}

El dictht del diccionario de Redis contiene dos dictht de tablas hash, que es para facilitar la operación de refrito. Al expandir la capacidad, repita los pares clave-valor en uno de los dictos al otro dictado, libere el espacio después de completar e intercambie los roles de los dos dictados.

typedef struct dict {
    
    
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
    unsigned long iterators; /* number of iterators currently running */
} dict;

La operación de repetición no se realiza de una vez, sino de forma progresiva, con el objetivo de evitar la carga de realizar demasiadas operaciones de repetición en el servidor a la vez.

El refrito progresivo se completa registrando el refrito del dict. Empieza desde 0 y luego no ejecuta un refrito. Por ejemplo, en un refrito, necesitas repetir dict [0] para dict [1], esta vez pon dict [ 0] en la tabla [El par clave-valor de rehashidx] es un refrito para dict [1], la tabla [rehashidx] de dict [0] apunta a nulo y rehashidx ++ está configurado.

Durante el refrito, cada vez que se agrega, borra, busca o actualiza el diccionario, se realizará un refrito progresivo. El uso del refrito progresivo hará que los datos del diccionario se dispersen en dos dictados, por lo que la operación del diccionario también se realizará en las dos tablas hash. Por ejemplo, cuando busque, primero busque desde ht [0], luego busque ht [1]. Cuando agregue, agréguelo directamente a ht [1].

Articulo de referencia

Redis

Supongo que te gusta

Origin blog.csdn.net/GreedySnaker/article/details/115164389
Recomendado
Clasificación