Principio de Redis (1) y comandos básicos (matriz flexible)

Redis serie de artículos

Redis (1) principio y comandos básicos (matriz flexible)
Redis (2) protocolo de red y modo asincrónico (bloqueo optimista y bloqueo pesimista)
Redis (3) principio de almacenamiento y modelo de datos (conflicto de hash, repetición progresiva)
Tabla de saltos de Redis


prefacio

Redis es la abreviatura de Remote Dictionary Service, que se denomina servicio de diccionario remoto; el cliente y el servidor de redis establecen una comunicación de red basada en TCP.
Redis es una base de datos en memoria (almacenada en la memoria en lugar del disco) y actualmente es una base de datos de valores clave de alto rendimiento en el mercado; la estructura de datos subyacente es hash, por lo que la complejidad de encontrar datos es O(1);

Redis es una base de datos no relacional que utiliza almacenamiento de clave-valor. Similar a una estructura de datos de tabla hash. Es diferente de las bases de datos relacionales como MySQL. Consulte MySQL (1) arquitectura básica, operación de declaración SQL, intento


1. Instalación y uso de Redis

Instalar

git clone https://gitee.com/mirrors/redis.git -b 6.2
cd redis
make
make test
make install

Instalado en /usr/local/bin por defecto
redis-server es el programa servidor
redis-cli es el programa cliente

puesta en marcha

mkdir redis-data
# 把redis文件夹下 redis.conf 拷贝到 redis-data # 修改 redis.conf
# requirepass 修改密码 123456
# daemonize yes
cd redis-data
redis-server redis.conf
# 通过 redis-cli 访问 redis-server
redis-cli -h 127.0.0.1 -a 123456

Dos, redis estructura

Redis es una estructura clave-valor
la clave es un
valor de cadena Hay varias estructuras de datos de uso común, como cadena, lista, hash, conjunto, zset

Cadena cadena : es una cadena binaria segura;
cola de dos extremos (lista enlazada) lista : ordenada (inserción ordenada);
tabla hash hash : no le importa el orden, que consiste en (campo, valor), donde el campo es único;
no ordenado set : no importa el orden, los valores internos son todos únicos;
conjunto ordenado zset : preste atención al orden, y los valores internos son únicos; determine la unicidad según el miembro; determine el orden según el marcador;

cadena

definición de cadena

Las cadenas en redis son una especie de cadenas dinámicas. En lenguaje C, una cadena es una matriz de cadenas terminadas en '\0'. Pero en redis, un conjunto de cadenas dinámicas simples (cadenas dinámicas simples, denominadas SDS) se crea por sí mismo.

Ventajas de SD:

  • Reducir el tiempo para obtener la longitud de la cadena.
  • Evite el desbordamiento del búfer (aumento de los caracteres de cadena por expansión y empalme. Los caracteres de cadena ordinarios sobrescribirán la siguiente cadena debido a la dirección continua)
  • Reducir el número de reasignaciones de memoria (liberación de espacio diferido y preasignación de espacio) Seguridad binaria

La estructura de datos de la cadena sds en el código fuente de redis:

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[];
};

La segmentación de cadenas en sds se divide por la longitud len, a diferencia de la cadena en lenguaje C donde \0 se usa como separador, lo que puede guardar más formas de datos. Datos binarios en cualquier formato, como datos de texto, imágenes, audio, archivos comprimidos, etc.

char buf[]; es una matriz flexible. Hay dos ventajas de usar matrices flexibles:
1. No hay necesidad de crear una nueva libre, el espacio de la matriz flexible se liberará después de liberar la estructura.
2. La inicialización no ocupa espacio.
3. La memoria asignada puede reducir la fragmentación de la memoria.

Para obtener detalles sobre arreglos flexibles, consulte ¿ Qué es un arreglo flexible?

cadena de caracteres

La cadena es una cadena dinámica. Cuando la longitud de la cadena es inferior a 1M, duplicará la expansión; si supera 1M, solo se expandirá 1M cada vez; la longitud máxima de la cadena es 512M; la cadena redis es una
cadena binaria segura, puede almacenar imágenes, protocolos binarios, etc.

Comandos básicos de cadena

# 设置 key 的 value 值
SET key val
# 获取 key 的 value
GET key
# 执行原子加一的操作
INCR key
# 执行原子加一个整数的操作
INCRBY key increment
# 执行原子减一的操作
DECR key
# 执行原子减一个整数的操作
DECRBY key decrement
# 如果key不存在,这种情况下等同SET命令。 当key存在时,什
么也不做
# SETNX 将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写。
SETNX key value
# 删除 key val 键值对
DEL key
# 设置或者清空key的value(字符串)在offset处的bit值。
SETBIT key offset value
# 返回key对应的string在offset处的bit值
GETBIT key offset
# 统计字符串被设置为1的bit数.
BITCOUNT key

estructura de almacenamiento

Si la longitud de la cadena es menor o igual a 20 y se puede convertir a un número entero, se almacenará en int; si la
longitud de la cadena es menor o igual a 44, se almacenará en embstr; si
la longitud de la cadena es superior a 44, se almacenará en bruto;

Escenario de aplicación

Operación de bloqueo distribuido del acumulador de almacenamiento de objetos

Lista de cola doble (lista enlazada)

Implementación de listas doblemente enlazadas, la complejidad temporal de la primera y la última operación (supresión y adición) de la lista es O(1), la complejidad temporal de encontrar elementos intermedios es O(n);

comando básico

# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]
# 从队列的左侧弹出一个元素
LPOP key
# 从队列的右侧入队一个或多个元素
RPUSH key value [value ...]
# 从队列的右侧弹出一个元素
RPOP key
# 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引
LRANGE key start end
# 从存于 key 的列表里移除前 count 次出现的值为 value 的元素
# list 没有去重功能 hash set zset
LREM key count value
# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
BRPOP key timeout # 超时时间 + 延时队列

Escenario de aplicación

Cola de pila
Cola
de bloqueo Cola
de mensajes asincrónicos
Obtener registros de ventana fijos

picadillo

Tabla hash, unordered_map indexa rápidamente el valor por clave;

comando básico

# 获取 key 对应 hash 中的 field 对应的值
HGET key field
# 设置 key 对应 hash 中的 field 对应的值
HSET key field value
# 设置多个hash键值对
HMSET key field1 value1 field2 value2 ... fieldn valuen
# 获取多个field的值
HMGET key field1 field2 ... fieldn
# 给 key 对应 hash 中的 field 对应的值加一个整数值
HINCRBY key field increment
# 获取 key 对应的 hash 有多少个键值对
HLEN key
# 删除 key 对应的 hash 的键值对,该键为field
HDEL key field

estructura de almacenamiento

El número de nodos es mayor que 512 (hash-max-ziplist-entries) o la longitud de todas las cadenas es mayor que > 64 (hash-max-ziplist-value), luego use dict para implementar; el número de nodos es menor que o igual a 512 y hay una longitud de cadena inferior a 64
, use ziplist para lograrlo;

Escenario de aplicación


carro de la compra de objetos de almacenamiento

COLOCAR

Colección; se utiliza para almacenar campos únicos, no se requiere orden;

comando básico

# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]
# 计算集合元素个数
SCARD key
# SMEMBERS key
SMEMBERS key
# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member
# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]
# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]
# 返回一个集合与给定集合的差集的元素
SDIFF key [key ...]
# 返回指定所有的集合的成员的交集
SINTER key [key ...]
# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]

estructura de almacenamiento

Si los elementos son todos enteros y el número de nodos es menor o igual a 512 (set-max-intseentries), se almacenará en una matriz de enteros; si uno de los elementos no es
un número entero o el número de nodos es superior a 512, se almacenará en un diccionario;

Escenario de aplicación

Lotería
llamar la atención común
Recomendar amigos

controlar

Colección ordenada; se utiliza para implementar la tabla de clasificación; es un único ordenado;

comando básico

# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素 order by id limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

estructura de almacenamiento

Si el número de nodos es mayor a 128 o si hay una longitud de cadena mayor a 64, use el skiplist (skiplist); si el número
de nodos es menor o igual a 128 (zset-max-ziplist-entries) y el la longitud de todas las cadenas es inferior o igual a 64 (zset-max-ziplist-value), use almacenamiento ziplist;
cuando los datos son pequeños, ahorre espacio;
cuando O(n) es grande, mejore el rendimiento de acceso; O(1) o O (inicio de sesión)

Escenario de aplicación

Baidu Hot List
Delay Queue
Temporizador distribuido
Ventana de tiempo Límite actual

Supongo que te gusta

Origin blog.csdn.net/weixin_44477424/article/details/131748118
Recomendado
Clasificación