¿Cómo agrega elementos la tabla de salto de Redis?

La pregunta compartida hoy proviene de una pregunta de entrevista real de Weilai.

Es imposible no preguntar a Redis en una entrevista de Java. Es imposible no preguntar sobre los tipos de datos comunes de Redis cuando se le pregunta sobre Redis. Cuando se le pregunta sobre los tipos de datos comunes de Redis, es imposible no preguntar sobre tablas de salto. Y agregar proceso, entonces Veamos juntos la respuesta a esta pregunta.

La colección ordenada de Redis  ZSet se compone de ziplist (lista comprimida) o skiplist (lista de saltos).

  1. La lista comprimida ziplist es esencialmente una matriz de bytes. Es una estructura de datos lineal diseñada por Redis para ahorrar memoria. Puede contener varios elementos, y cada elemento puede ser una matriz de bytes o un número entero.
  2. Skip list skiplist es una estructura de datos ordenada, que logra el propósito de acceder rápidamente a los nodos manteniendo múltiples punteros a otros nodos en cada nodo. La tabla de saltos admite la búsqueda de nodos con una complejidad promedio de O(logN) y la peor de O(N), y también puede procesar nodos en lotes a través de operaciones secuenciales.

Introducción a la tabla de salto

Skip List Skip List, también conocida como tabla de salto, es una estructura de datos para operaciones de búsqueda eficientes en una colección de elementos ordenados. Proporciona una forma de intercambiar espacio por tiempo para acelerar la búsqueda al agregar una lista enlazada de múltiples capas.

Una lista de omisión consiste en una lista vinculada con múltiples niveles de nodos, siendo cada nivel un subconjunto de la lista vinculada original. La capa inferior es una lista enlazada ordenada completa que contiene todos los elementos. Cada nivel superior es un subconjunto del nivel inferior al agregar punteros adicionales para omitir algunos elementos. Estos punteros adicionales se denominan "punteros de salto" y permiten un acceso más rápido a más nodos, lo que reduce el número de comparaciones necesarias para las búsquedas.

La complejidad promedio del tiempo de búsqueda de una tabla de salto es O(log n), donde n es el número de elementos. Esto proporciona un rendimiento de búsqueda más rápido que una lista enlazada ordenada normal y es más sencillo de implementar que un árbol de búsqueda binario equilibrado, como un árbol rojo-negro.

A continuación se muestra una tabla de salto simple:

Proceso de adición de tablas de salto

Conocimiento previo: número de nodos de capa aleatoria

Antes de comenzar a hablar sobre el proceso de agregar tablas de salto, primero debemos comprender un concepto: la cantidad de capas aleatorias de nodos. El llamado número aleatorio de capas se refiere a la cantidad de capas aleatorias del nodo actual que se generarán antes de agregar cada nodo, y cuántas capas del nodo actual se almacenarán en la lista vinculada de acuerdo con el número aleatorio generado. de capas

¿Por qué está diseñado de esta manera?

El propósito de este diseño es asegurar la eficiencia de ejecución de Redis.

¿Por qué generar un número aleatorio de capas en lugar de formular una regla fija? Por ejemplo, el nodo de la capa superior se compone de una lista enlazada que abarca dos nodos en la capa inferior, como se muestra en la siguiente figura:

Si se formulan reglas, es necesario realizar un procesamiento adicional para satisfacer las reglas al agregar o eliminar, como agregar un nuevo nodo, como se muestra en la siguiente figura:

De esta manera, la regla establecida de que el nodo de la capa superior cruza los dos nodos de la capa inferior no se cumple, y todos los nodos de la capa superior deben ajustarse adicionalmente, de modo que la eficiencia del programa se reducirá, por lo que el número aleatorio de capas se utiliza, y la regla no se aplica, por lo que no se requieren operaciones adicionales para que no se consuma el tiempo de ejecución del servicio.

añadir proceso

El proceso de agregar una tabla de salto en Redis se muestra en la siguiente figura:

  1. El primer elemento se agrega a la lista enlazada ordenada inferior (la capa inferior almacena todos los datos de los elementos).
  2. El número de capas aleatorias generadas por el segundo elemento es 2, así que agregue 1 capa más y almacene este elemento en la primera y más baja capa.
  3. El número de capas aleatorias generadas por el tercer elemento es 4, así que agregue 2 capas más, y toda la tabla de salto se convierte en 4 capas, y guarde este elemento en todas las capas.
  4. El número de capas aleatorias generadas por el cuarto elemento es 1, por lo que se puede guardar en la última capa en orden.

Otros nodos recién agregados se pueden deducir por analogía.

Análisis de código fuente de capa aleatoria

El código fuente del nivel aleatorio está en t_zset.c/zslRandomLevel(void), de la siguiente manera:

int zslRandomLevel(void) {
    int level = 1;
    while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))
        level += 1;
    return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;
}

Se puede ver en el código fuente que el número aleatorio de capas tiene un 50 % de probabilidad de ser asignado al Nivel 1, un 25 % de probabilidad de ser asignado al Nivel 2, un 12,5 % de probabilidad de ser asignado al Nivel 3, etcétera.

El nivel máximo predeterminado permitido por la tabla de omisión de Redis es 32, que se define en el código fuente ZSKIPLIST_MAXLEVEL.

resumen

La tabla de salto se compone de múltiples listas enlazadas ordenadas. La capa inferior almacena los datos de todos los elementos. Este almacenamiento hace que la consulta sea más eficiente y la complejidad de la consulta cambia de O (n) a O (log n). El proceso de agregar la tabla de salto se basa en el número aleatorio de capas generadas por los nodos, y su inserción en el nodo inferior y en los nodos de la capa superior N-1. La clave para describir el proceso de adición es comprender el número de capas aleatorias. capas y los principios detrás de él.

Supongo que te gusta

Origin blog.csdn.net/mxt51220/article/details/131430264
Recomendado
Clasificación