【Redis】 Análisis subyacente I: ¿Cómo se implementa el conjunto ordenado de Redis (ZSet)?

        Este artículo tiene un total de 1865 palabras y el tiempo estimado de lectura es de 5 minutos.

Tabla de contenido

Método de codificación ZSet

¿Qué es una lista de omisión?

La estructura subyacente de ZSet

Proceso de consulta de lista de salto


Método de codificación ZSet

        La implementación subyacente del conjunto ordenado zset en Redis utiliza dos métodos de codificación:

  • Lista de omisión REDIS_ENCODING_SKIPLIST
  • REDIS_ENCODING_ZIPLIST lista comprimida

        Hay dos factores clave para activar métodos/condiciones de diferentes codificaciones:

  • entradas-zset-max-ziplist 128
  • zset-max-ziplist-valor 64

        Cuando el número de elementos en el conjunto ordenado ≥ zset-max-ziplist-entries (128), o la longitud de cada miembro del elemento ≥ zset-max-ziplist-value (el valor predeterminado es 64 bytes), use listas de salto y hash Tablas hash sirven como implementaciones internas de conjuntos ordenados.

expandir:

        Puede definir el momento de utilizar dos codificaciones diferentes en el archivo de configuración de Redis (redis.conf).

¿Qué es una lista de omisión?

        Una lista de omisión es una estructura de datos ordenada (algunas versiones dirían que es una estructura de datos aleatoria, donde la aleatorización se refiere a probabilidad), escrita por William Pugh en el artículo " Skip Lists: A Probabilis... Trees" . Guíe cada nodo para que apunte a los nodos posteriores de acuerdo con diferentes niveles de orientación para lograr el propósito de acceder rápidamente a los nodos designados. Cuando se busca un nodo específico en una lista de salto, la complejidad de tiempo promedio es O(logN) y la complejidad de tiempo en el peor de los casos es O(N) .

La estructura subyacente de ZSet

/* ZSETs use a specialized version of Skiplists */



///     ele: 当前节点元素,用以存储数据
///     score: 当前元素成员所对应的分数
///     backward:用以指向前驱节点的指针,即回溯指针
///     level:用以表示层级,每一层级对应指向一个指针 forward
///     forward:指向位于表尾方向其他节点的指针。
///     span:当前节点到forward指向的节点所跨越的节点个数。


typedef struct zskiplistNode {
    sds ele;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];
} zskiplistNode;


///     header: 指向头部跳跃表节点的指针。
///     tail:指向尾部跳跃表节点的指针。
///     length:表示跳跃表中的节点总数。
///     level:表示跳跃表中层数最大的节点的层数,表头节点的层数不计算在内。


typedef struct zskiplist {
    struct zskiplistNode *header, *tail;
    unsigned long length;
    int level;
} zskiplist;

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset;

lista de omisión de redis

        A partir de la leyenda y el código, podemos encontrar fácilmente que la estructura zset en Redis se compone de zskiplist y dict . Al mismo tiempo, la estructura zskiplist contiene el nodo de lista de omisión zskiplistNode y el nivel de lista de omisión zskiplistLevel , formando así una lista doblemente enlazada. estructura .

Proceso de consulta de lista de salto

        A continuación, analicemos el proceso de consulta de la tabla de salto.

        En la figura anterior, el nivel de la tabla de salto es de 4 niveles y el número de elementos es 10. La búsqueda se realiza en orden de arriba hacia abajo, comenzando desde la capa superior (capa 4) para encontrar el valor del elemento 17: 

  • El cuarto nivel: encuentre el valor del elemento 7, pero encuentre que 7 ≤ 17, continúe buscando hacia la derecha; encuentre el valor del elemento 29, pero encuentre que 7 ≤ 29, regrese al puntero anterior que apunta al valor del elemento 7 y bajar un nivel.
  • El tercer nivel: encuentre el valor del elemento 25, pero encuentre que 25≥17, retroceda hasta el puntero que apunta al valor del elemento 7 y baje un nivel
  • Segundo nivel: encuentre el valor del elemento 16, pero encuentre que 16≤17, continúe buscando hacia la derecha; encuentre el valor del elemento 17, presione el valor de búsqueda y la búsqueda es exitosa

        

        En el próximo capítulo, analizaremos más a fondo la implementación del algoritmo y el código utilizados en ZSet y exploraremos más a fondo el rendimiento y los principios matemáticos detrás de él.

Supongo que te gusta

Origin blog.csdn.net/weixin_42839065/article/details/131763688
Recomendado
Clasificación