Redis implementación subyacente de los cinco tipos de datos

breve introducción

Redis cinco de cinco tipos de datos denominado objeto de datos; 6 describen las estructuras de datos anteriormente grandes, Redis no utilizan estas estructuras para implementar la clave de la base de datos, pero estas estructuras se utilizan para construir un sistema de objetos redisObject; El sistema de destino contiene cinco datos, cuerdas (cuerda), una lista de objetos (lista), el objeto de hash (hash), una colección (set) un conjunto ordenado de objetos y objetos (zConfigurar); y los datos de la capa inferior que codifican los cinco objetos se pueden pedir objeto codificación para visualizarla.

estructura redisObject

typedef struct redisObject {
    // 类型
    unsigned type:4;
    // 编码
    unsigned encoding:4;
    // 指向底层实现数据结构的指针
    void *ptr;
    // ...
} robj;

redis son pares de clave y valor almacenado de datos, por lo que el objeto se divide en objetos y objetos de valor clave, que es un almacén de claves-valor pares de valores clave crearán dos objetos, objetos clave y objetos de valor.
objeto clave es siempre un objeto de cadena, y el valor del objeto puede ser cualquiera de los cinco objetos.

  • tipo de atributo es el tipo de almacenamiento de objetos, es decir, decimos la cadena, lista, hachís, conjunto, zConfigurar de uno, se puede utilizar la tecla de comando TYPE para la vista.
  • que codifica registro de atributo utilizado por la formación de codificación, es decir, que las estructuras de datos utilizadas para lograr el objeto subyacente.

Aquí Insertar imagen Descripción
La tabla muestra la salida correspondiente a la orden subyacente de código y constantes objeto de codificación, los tres primeros son la estructura de las cadenas

Cuando depositamos clave-valor y un par clave-valor no se especifica la codificación de objetos, pero Redis se fijará de acuerdo con el sistema sin el uso de una escena de objetos es diferente codificación, para ahorrar memoria, velocidad hasta el fin de la velocidad de la visita.

objeto String (cadena)

objeto String estructura de datos subyacente implementa como un simple cuerdas dinámicas (SDS) y se almacenan directamente, pero el modo de codificación puede ser int, en bruto o embstr, excepto que diferentes estructuras de memoria.

(1) int codificación

Es un valor entero almacenado en una cadena, y esto puede representarse formalmente como un tipo largo, a continuación, se almacena directamente en el atributo ptr redisObject de, el conjunto int codificada, como se muestra:
Aquí Insertar imagen Descripción

(2) codificada en bruto

Valor mayor que 32 bytes de cadena almacenada cadena, una estructura de cuerdas dinámicas simples (SDS), y que codifica para prima, esta vez es consistente con la estructura de memoria estructura SDS, es dos veces el número de asignación de memoria, la creación de objetos redisObject y la estructura sdshdr, como se muestra:
Aquí Insertar imagen Descripción

(3) embstr codificación

String String valor almacenado inferior o igual a 32 bytes, es también fácil de usar cuerdas dinámicas (estructura SDS), pero la arquitectura de memoria está optimizado para una cadena almacenada Dunxiao; asignación de memoria necesidad sólo una vez para ser completado, un espacio continuo se puede asignar como:
Aquí Insertar imagen Descripción
cadena resumen objeto:

  • En Redis, la almacena largo, del tipo de doble punto flotante se convierte a continuación en una cadena almacenada.
  • y la codificación de efecto embstr prima es el mismo, excepto que la asignación de memoria y de liberación, crudo dos veces, una embstr.
  • embstr bloque continuo de memoria, la memoria caché puede hacer un mejor uso de las ventajas de
  • código int y añadiendo la cadena embstr de codificación y otras operaciones, si se hace, serán convertidos a la condición de codificación en bruto se satisface; embstr objeto de codificación se lee, una vez que la primera modificación se transcodificará a crudo.

Lista de objetos (lista)

Antes de la versión 3.2: codificado lista de objetos que se pueden ZipList y uno LinkedList.

(1) codificación ZipList

hash de ZipList de codificación Caprice implementación subyacente es una lista de compresión, cada nodo comprimido en la lista tiene un elemento de la lista.
Aquí Insertar imagen Descripción

(2) LinkedList codificación

LinkedList que codifica el extremo del doble fondo de la aplicación lista enlazada, cada uno del nodo de lista enlazada de doble extremo mantiene un objeto String, para ahorrar unos elementos de la lista dentro de cada objeto de cadena.
Aquí Insertar imagen Descripción
Lista de objetos transcodificación:

  • Una lista de objetos utilizando necesidad de codificación ZipList para satisfacer dos condiciones: En primer lugar, todas las cuerdas son más pequeñas que 64 bytes, la segunda es menor que el número de elementos 512, se utilizará no satisface una cualquiera de LinkedList codificación.
  • dos condiciones digitales pueden ser modificados en el archivo de configuración Redis, opción de la lista max-ZipList-valor y una opción de lista de Max-ZipList-entradas.
  • La figura StringObject está en objetos mencionados una cadena, el único objeto de cadena se utiliza como un objeto anidado en objeto cinco.

Después de la versión 3.2: la lista Lista rápida codificación de objetos.

Lista rápida de codificación

Lista rápida ZipList y es una mezcla de LinkedList, se sección de prensa LinkedList segmentado, cada segmento ZipList utiliza para almacenamiento compacto, conectado en serie entre una pluralidad puntero bidireccional ZipList.
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Redis estará en el almacenamiento comprimido ZipList, algoritmo de compresión de uso LZF, se puede seleccionar la profundidad de compresión.
quicklist profundidad de compresión predeterminado es 0, que no está comprimido. La profundidad real de la compresión se determina por el parámetro de configuración de la lista-compresa profundidad. Para apoyar las operaciones de empuje / pop rápidos, inclusive de dos quicklist ZipList no comprimido, entonces la profundidad es de 1. Si la profundidad es 2, esto significa que un primer extremo quicklist ZipList a extremo y un segundo extremo a extremo ZipList no comprimido.
longitud ZipList:
longitud predeterminada interna quicklist ZipList solo es 8k bytes, más allá de este número de bytes será un nuevo ZipList de partida.
longitud ZipList de lista max-ZipList de tamaño determinado por los parámetros de configuración.

objeto Hash (hash)

objeto hash codificado puede ser ZipList y una tabla hash.

(1) codificación ZipList

ZipList codificada objeto hash implementación subyacente está lista comprimido, el hash de codificación sujeto ZipList, clave-valor por medio de la llave en la compresión lista estrechamente vinculados, la primera llave en el extremo de la mesa, y luego en valor; clave-valor siempre se añade al final de la tabla.
Aquí Insertar imagen Descripción

(2) de codificación tabla hash

hashtable objeto hash subyacente se logra diccionario de codificación, cada uno de los objetos de pares de clave y valor de hash de usar un diccionario para almacenar el par clave-valor.
Par clave-valor que es el diccionario, las claves y valores del diccionario son objeto de cadena diccionario para guardar la clave clave-valor, el valor de la clave de diccionario de valor almacenado de valor.
Aquí Insertar imagen Descripción
Hash código objeto de conversión:

  • usos objeto hash de codificación ZipList necesitan para satisfacer dos condiciones: los valores de clave y la longitud de cadena de la primera, todas las teclas son menos de 64 bytes; la segunda es menor que el número de pares de valores clave 512; no satisface un uso cualquier codificación tabla hash .
  • El por encima de dos condiciones se pueden opción de hash-max-ZipList-valor y el hash-max-ZipList-entradas opción de perfil Reids en modificar.

Una colección de objetos (set)

colección codificada de objetos puede ser intset y una tabla hash.

(1) intset codificación

se logra colección intset de objetos subyacentes conjunto codificado de números enteros, todos los elementos se almacenan en un conjunto de números enteros.
Aquí Insertar imagen Descripción

(2) de codificación tabla hash

tabla hash colección de objetos implementación subyacente se codifica diccionario, el diccionario de cada tecla es un objeto de cadena, para guardar un elemento de la colección, excepto que los valores del diccionario son NULL; consulte estructura hashset de java.
Aquí Insertar imagen Descripción
Transcodificación colección de objetos:

  • Intset codifica usando una colección de objetos tiene que cumplir con dos condiciones: en primer lugar, todos los elementos son valores enteros, y el segundo es el número de elementos menor o igual 512; no satisface cualquiera utilizará codificación tabla hash.
  • Más segunda condición puede ser modificado-et-max intset-entradas opción archivo de configuración Redis.

conjunto ordenado de objetos (zConfigurar)

conjunto ordenado de codificación puede ser ZipList y uno skiplist.

(1) codificación ZipList

Un conjunto ordenado de objetos se consigue la lista de compresión de codificación de ZipList subyacente, que es similar a la estructura del hash objeto, excepto que la compresión de dos lista estrechamente vinculada de nodos, el valor de la primera miembro de sujeción de los elementos, los segundos elementos almacenados, y un pequeño valor cercano a la cabecera, pie de página y cerca de gran tamaño.
Aquí Insertar imagen Descripción

(2) skiplist codificación

un conjunto ordenado de objetos se consigue la skiplist subyacente codifica dos tipos de salto y diccionarios;
cada nodo mantiene un elemento de tabla hop colección, y pulse el valor en orden ascendente; objeto nodo de almacenamiento atributo de los elementos de miembro, atributo puntuación sostiene puntuación;
diccionario de cada tecla para guardar un elemento de la colección, los miembros de los elementos clave para salvar al diccionario, y los valores del diccionario son las puntuaciones guardadas.
Aquí Insertar imagen Descripción
¿Por skiplist codificación a utilizar tanto saltar y diccionarios para lograr?

  • ventaja Jump Tabla se ordena, pero la puntuación de la consulta complejidad O (log n); consulta diccionario puntuación complejidad O (1), pero el trastorno, por lo que incluso un poco de ser implementado en conjunción con la estructura.
  • Aunque el uso de los miembros elementales y dos anotaciones, pero la estructura de la colección es compartida por las dos estructuras puntero a la misma dirección, sin memoria emaciación.

conjunto ordenado de conversión que codifica:

  • Que codifica el objeto colección ordenada utiliza necesidad ZipList para satisfacer dos condiciones: en primer lugar, todos los elementos de una longitud de menos de 64 bytes; el segundo es el número de elementos de menos de 128; un no satisfacen cualquiera de las condiciones utilizadas skiplist codificación.
  • Lo anterior dos condiciones pueden modificarse zConfigurar-max-ZipList-entradas y las opciones zConfigurar-ZipList-max-valor de opción de configuración Redis.

escenarios

Redis escenarios generales

  • sesión de caché (single sign-on)
  • Distribuido de bloqueo, tales como: el uso de setnx
  • O listas de la mejor contador
  • Listado de productos o listas de bases de datos de usuario, etc.
  • Columnas utilizando la lista como el mensaje
  • Spike, inventario y otras deducciones

Cinco tipos de escenarios de aplicación

  • String, KV redis para la operación de alta eficiencia puede ser utilizado directamente como un contador. Por ejemplo, el número de estadísticas en línea, etc., el otro tipo es una cadena de seguridad de almacenamiento binario, por lo que se puede utilizar para almacenar imágenes y vídeo, incluso.
  • hachís, almacenado par clave-valor puede ser utilizado generalmente para mantener la información básica atributo de un objeto, por ejemplo, la información del usuario, información del producto, etc. Además, dado que el tamaño de la hash utilizado es menor que el tamaño configurado cuando la estructura es ZipList, más costo la memoria, por lo que para se puede considerar una gran cantidad de almacenamiento de datos para utilizar el hash para alcanzar la cantidad de fragmentación de la compresión de datos, con fines de ahorro de memoria, por ejemplo, por el nombre de la dirección de la imagen correspondiente a las grandes cantidades de mercancías. Por ejemplo: un código de mercancía fijo es 10 bits, el primero puede ser seleccionado como un hash clave 7 después de un período de tres Field, cuadro como un valor de dirección. Cada tabla hash de manera que no más de 999, siempre y cuando el redis.conf de hash-max-ZipList-entradas se cambió a 1024, pueden.
  • lista, tipo de lista, se puede utilizar para aplicar la cola de mensajes, también puede utilizarlo para proporcionar un comando de rango, hacer consultas de paginación.
  • conjunto, colección, lista ordenada de números enteros se pueden utilizar establece directamente. Algunas funciones de ponderación se pueden utilizar para, por ejemplo, un nombre de usuario no se puede repetir, etc. Además, también se puede configurar de intersección, y las operaciones de ajuste, ciertos elementos comunes para encontrar
  • zConfigurar, conjunto ordenado, se puede utilizar para encontrar el rango, tablas de clasificación o la función TopN.

resumen

En cinco de los datos de objeto Redis, objeto de cadena es el único de los otros cuatro puede ser embebido como un objeto de datos de destino;

Lista (lista), el hash (hash), conjunto (SET), un conjunto ordenado (zConfigurar) que subyace aplicación utiliza tanto la estructura de la lista condición comprimida, una estructura de lista mediante una compresión y son relativamente pequeños en número de elementos, la longitud de bytes caso de corto;

La ventaja de utilizar la lista de cuatro compresión de datos de objetos:
(1) ahorrar memoria, la reducción de sobrecarga de memoria, la base de datos de memoria Redis está, por lo tanto reduciendo la memoria sobrecarga es necesario en determinadas circunstancias.
(2) reducir la fragmentación de la memoria, la compresión lista bloque de memoria es continua, y el número de memoria asignada una vez.
(3) comprimir la nueva lista, borrar, operación de búsqueda la complejidad tiempo promedio es de O (N), N en un cierto rango de nuevo, esta vez es casi despreciable, y el valor límite superior de N es configurable .
(4) de cuatro objeto de datos tiene dos estructura de codificación, mayor flexibilidad.

Publicados 158 artículos originales · ganado elogios 119 · vistas 810 000 +

Supongo que te gusta

Origin blog.csdn.net/u013474436/article/details/104481591
Recomendado
Clasificación