Notas de Power Node Redis7 - Capítulo 3 Comandos de Redis

3 comandos Redis

Redis se puede dividir en tres categorías según los objetos operados por los comandos: comandos para operaciones básicas en Redis, comandos para operaciones de clave y comandos para operaciones de valor.

3.1 Comandos básicos de Redis

Primero ingrese al cliente de línea de comandos de Redis a través del comando redis-cli y luego ejecute el siguiente comando.

3.1.1 Comando ping Heartbeat

Escriba el comando ping y verá una respuesta PONG, lo que significa que la conexión entre el cliente y Redis es normal. Este comando también se conoce como el comando de latido.

3.1.2 Leer y escribir comandos clave-valor

establecer el valor clave escribirá el valor clave especificado en la base de datos. get key leerá el valor de la clave especificada. Para más formatos de comando set y get, aprenderemos en detalle más adelante.

3.1.3 Selección de cambio de base de datos

Redis tiene 16 bases de datos por defecto. Esto se puede ver visualmente en el cliente gráfico de Redis Desktop Manager (RDM).

De forma predeterminada, se utiliza el número de base de datos 0, y la base de datos se puede cambiar seleccionando el índice de base de datos. Por ejemplo, el siguiente comando cambiará a DB3 y escribirá age-23 en DB3.

Y este resultado se puede ver intuitivamente en RDM.

3.1.4 Comprobar el número de claves dbsize

El comando dbsize puede ver el número de claves en la base de datos actual.

De la inspección anterior, hay 2 claves en DB0, ninguna clave en DB1 y 1 clave en DB3.

3.1.5 Eliminar los datos de flushdb en la base de datos actual

El comando flushdb solo elimina los datos de la base de datos actual y no afecta a otras bases de datos.

3.1.6 Eliminar todos los datos en la base de datos comando flushall

El comando flushall puede eliminar todos los datos en todas las bibliotecas. Así que usa este comando con precaución.

3.1.7 Comando de salida del cliente

Utilice el comando exit o quit para salir del cliente de línea de comandos de Redis.

3.2 Comandos de operación clave

Los datos almacenados en Redis son un Mapa en su conjunto, su clave es de tipo Cadena y el valor puede ser Cadena, Tabla hash, Lista, Conjunto y otros tipos.

3.2.1 teclas

  • Formato: patrón de LLAVES
  • Función: Encuentra todas las teclas que coincidan con el patrón patrón dado, el patrón es una expresión regular.
  • Nota: KEYS es muy rápido, pero usarlo en una base de datos grande puede bloquear el servicio del servidor actual. Por lo tanto, este comando generalmente no se usa en el entorno de producción y, en su lugar, se usa el comando escanear.

3.2.2 existe

  • Formato: tecla EXISTE
  • Función: Comprobar si existe la clave dada.
  • Descripción: Si la clave existe, devuelve 1, de lo contrario, devuelve 0.

3.2.3 del

  • Formato: tecla DEL [tecla...]
  • Función: Eliminar una o más claves dadas. Las claves que no existen se ignoran.
  • Descripción: Devuelve el número de claves eliminadas.

3.2.4 renombrar

  • Formato: RENOMBRAR clave nueva clave
  • Función: Renombrar clave a nueva clave.
  • Descripción: cuando la clave es la misma que nueva clave, o la clave no existe, se devuelve un error. Cuando newkey ya existe, el comando RENAME sobrescribirá el valor anterior. Solicita Aceptar cuando el nombre se cambia correctamente y devuelve un error cuando falla.

3.2.5 mover

  • Formato: tecla MOVE db
  • Función: Mueve la clave de la base de datos actual a la base de datos dada.
  • Explicación: si la base de datos actual (base de datos de origen) y la base de datos dada (base de datos de destino) tienen una clave dada con el mismo nombre, o si la clave no existe en la base de datos actual, MOVE no tiene efecto. Devuelve 1 si el movimiento fue exitoso y 0 si falló.

3.2.6 tipo

  • Formato: tecla TYPE
  • Función: Devuelve el tipo del valor almacenado en la clave.
  • Descripción: el valor de retorno tiene los siguientes seis tipos
  • ninguno (la clave no existe)
  • cadena (cadena)
  • lista (lista)
  • conjunto (colección)
  • zset (conjunto ordenado)
  • hash (tabla hash)

3.2.7 caducar y caducar

  • Formato: segundos clave EXPIRE
  • Función: establece la vida útil de una clave determinada. Cuando la clave caduca (el tiempo de vida es 0), se elimina automáticamente. La unidad de tiempo de caducidad es segundos y la unidad de tiempo de caducidad es milisegundos. En Redis, se dice que las claves con tiempo de vida son "volátiles".
  • Descripción: Devuelve 1 si el tiempo de supervivencia se establece correctamente. Devuelve 0 si la clave no existe. La operación de cambio de nombre no cambia la duración de la clave.

3.2.8 ttl a pttl

  • Formato: clave TTL
  • Función: TTL, tiempo de vida, devuelve el tiempo de vida restante para una clave determinada.
  • Nota: Hay tres posibles valores de retorno:
  • Devuelve -2 cuando la clave no existe.
  • Devuelve -1 cuando la clave existe pero no se ha establecido ningún tiempo de vida restante.
  • De lo contrario, devuelve el tiempo de vida restante de la clave. La unidad de tiempo devuelta por el comando ttl es segundos y la unidad de tiempo devuelta por el comando pttl es milisegundos.

3.2.9 persistir

  • Formato: tecla PERSIST
  • Función: elimine la vida útil de una clave determinada y convierta esta clave de "volátil" a "duradera".
  • Nota: Cuando la vida útil se elimina con éxito, se devuelve 1; si la clave no existe o la vida útil no está configurada para la clave, devuelve 0.

3.2.10 clave aleatoria

  • Formato: ALEATORIO
  • Función: Devolver aleatoriamente (no eliminar) una clave de la base de datos actual.
  • Descripción: cuando la base de datos no está vacía, devuelve una clave. Devuelve nil cuando la base de datos está vacía.

3.2.11 escanear

  • 格式:Cursor SCAN [Patrón COINCIDIR] [Cuenta COUNT] [Tipo tipo]
  • Función: se utiliza para iterar sobre las claves de la base de datos en la base de datos. El significado de cada opción es:
  • cursor: El cursor al comienzo de esta iteración.
  • patrón: el patrón de la clave que se emparejará en esta iteración.
  • count : cuántos elementos devolver del conjunto de datos en esta iteración, el valor predeterminado es 10.
  • type: el tipo de valor que se devolverá en esta iteración, por defecto para todos los tipos.

El comando SCAN es un iterador basado en cursor: cada vez que se llama al comando SCAN, devolverá una matriz que contiene dos elementos al usuario, el primer elemento es un nuevo cursor para la siguiente iteración y el segundo Los elementos son una matriz , que contiene todos los elementos que se iteran. El usuario necesita usar este nuevo cursor como parámetro de cursor del comando ESCANEAR en la próxima iteración, para continuar con el proceso de iteración anterior. Cuando el parámetro del cursor del comando SCAN se establece en 0, el servidor comenzará una nueva iteración. Si el nuevo cursor devuelve 0, la iteración ha terminado.

  • Descripción: la iteración incremental con cursores intermitentes, negativos, fuera de rango u otros cursores anormales no bloqueará el servidor.

Cuando la cantidad de datos es grande, es posible que la especificación de conteo no funcione y Redis ajustará automáticamente la cantidad de recorridos cada vez. Dado que el comando de escaneo solo devuelve una pequeña cantidad de elementos cada vez que se ejecuta, este comando se puede usar en un entorno de producción sin el problema de bloqueo del servidor causado por el comando KEYS.
El algoritmo utilizado por el comando de iteración incremental solo garantiza que la iteración se detendrá cuando el tamaño del conjunto de datos sea limitado. En otras palabras, si el tamaño del conjunto de datos iterados continúa creciendo, es posible que el comando de iteración incremental nunca se detenga. para completar una iteración completa. Es decir, cuando un conjunto de datos crece cada vez más, se necesita realizar más y más trabajo para acceder a todos los elementos del conjunto de datos. Que una iteración pueda finalizar depende de si la velocidad a la que el usuario ejecuta la iteración es más rápida. que la velocidad a la que crece el conjunto de datos.

  • Comandos relacionados: Además, hay 3 comandos de escaneo para recorrer los tres tipos de valores.
    - hscan: pertenece al conjunto de comandos de operación de valor de tipo Hash, que se utiliza para recorrer todos los pares de campo-valor de la tabla Hash especificada en la base de datos actual.
    - sscan: pertenece al conjunto de comandos de operación de valor de tipo Set, que se utiliza para recorrer todos los elementos de la colección de conjuntos especificada en la base de datos actual - zscan: pertenece
    al conjunto de comandos de operación de valor de tipo ZSet, que se utiliza para recorrer todos los elementos de el conjunto ordenado especificado en la base de datos actual (valor y valor del elemento)

3.3 Comando de operación de valor de cadena

El valor de los datos almacenados en Redis puede ser un tipo de datos de cadena. El tipo Value of String es el tipo más básico y común en Redis. Cualquier dato se puede almacenar en el tipo Valor de cadena, incluidas imágenes numéricas o incluso binarias, audio, video, objetos serializados, etc. El tamaño máximo de un valor de tipo String es 512M.

3.3.1 conjunto

  • 格式:Valor clave SET [EX segundos | PX milisegundos] [NX|XX]
  • Función: además de establecer directamente el valor de la clave como valor, SET también puede especificar algunos parámetros.
    • EX segundos: establezca el tiempo de caducidad de la clave actual, en segundos. Equivalente al comando SETEX.
    • PX milisegundos: establece el tiempo de caducidad de la clave actual, en milisegundos. Equivalente al comando PSETEX.
    • NX: si la clave especificada no existe, se establecerá correctamente, que se utiliza para agregar la clave especificada. Equivalente al comando SETNX.
    • XX: la clave especificada debe existir para establecerse correctamente y se utiliza para actualizar el valor de la clave especificada.
  • Nota: Si la cadena de valor contiene espacios, la cadena debe estar entre comillas dobles o simples, de lo contrario, se considerará que la cantidad de parámetros del comando set es incorrecta y se informará un error.

3.3.2 setex y psetex

  • Formato: valor de segundos clave SETEX/PSETEX
  • Función: establecer expiración, que no solo especifica el valor de la clave, sino que también establece el tiempo de supervivencia de la misma. La unidad de setex es segundos, y la unidad de psetex es milisegundos.
  • Descripción: si la clave ya existe, se sobrescribirá el valor anterior. Este comando es similar a los siguientes dos comandos. La diferencia es que SETEX es una operación atómica, y las dos acciones de asociar el valor y configurar el tiempo de vida se completarán al mismo tiempo. Este comando es muy práctico cuando se usa Redis como un caché

SET clave valor
EXPIRE clave segundos # Establecer el tiempo de supervivencia

3.3.3 setnx

  • Formato: valor de clave SETNX
  • Función: ESTABLECER si no existe, establece el valor de la clave en valor si y solo si la clave no existe. Si la clave dada ya existe, SETNX no hace nada. Si tiene éxito, devuelve 1, de lo contrario, devuelve 0.
  • Descripción: este comando es equivalente a establecer el valor de la clave nx

3.3.4 ponerse a punto

  • Formato: valor de clave GETSET
  • Función: establece el valor de la clave dada en valor y devuelve el valor anterior de la clave.
  • Descripción: cuando la clave existe pero no es un tipo de cadena, devuelve un error; cuando la clave no existe, devuelve nil.

3.3.5 mset y msetnx

  • Formato: valor de clave MSET/MSETNX [valor de clave...]
  • Función: Establecer uno o más pares clave-valor al mismo tiempo.
  • Nota: Si una clave dada ya existe, MSET sobrescribirá el valor anterior original con el nuevo valor. Si este no es el efecto que desea, considere usar el comando MSETNX: solo se usará cuando todas las claves dadas no existan. este caso, realice la operación de ajuste. MSET/MSETNX es una operación atómica. Todas las claves dadas se configurarán al mismo tiempo. Es imposible que algunas claves dadas se actualicen mientras que otras permanecen sin cambios. El comando nunca falla.

3.3.6 mgget

  • Formato: tecla MGET [tecla...]
  • Función: Devuelve todos (uno o más) valores de la clave dada.
  • Explicación: si una determinada clave no existe en la clave dada, entonces esta clave devuelve el valor especial nulo. Por lo tanto, el comando nunca falla.

3.3.7 añadir

  • Formato: valor de clave ANEXO
  • Función: si la clave ya existe y es una cadena de caracteres, el comando APPEND agregará el valor al final del valor original de la clave. Si la clave no existe, APPEND simplemente establece la clave dada en el valor, al igual que ejecutar el valor de la clave SET.
  • Descripción: después de agregar valor, la longitud de la cadena en la clave.

3.3.8 aumento y disminución

  • Formato: tecla INCR o tecla DECR

  • Función: incremento, auto-incremento. Incrementa el valor numérico almacenado en la clave en uno.

    decrement,自动递减。将key中存储的数字值减一。
    
  • Nota: Si la clave no existe, el valor de la clave se inicializará en 0 primero y luego se realizará la operación de incremento/decremento. Devuelve un error si el valor no se puede representar como un número. Si se ejecuta correctamente, devuelve el valor incrementado/decrementado.

3.3.9 subir y bajar

  • Formato: incremento de tecla INCRBY o decremento de tecla DECRBY
  • Función: aumenta/disminuye el valor especificado del valor digital almacenado en la clave, este valor solo puede ser un número entero, puede ser un número negativo, pero no puede ser un decimal.
  • Nota: Si la clave no existe, el valor de la clave se inicializará a 0 primero y luego se realizará la operación de aumento/disminución. Devuelve un error si el valor no se puede representar como un número. Si se hace correctamente, devuelve el valor incrementado/decrementado.

3.3.10 incrbyfloat

  • Formato: incremento de clave INCRBYFLOAT
  • Función: suma el incremento del número de punto flotante al valor almacenado en la clave.
  • Instrucciones: Las mismas instrucciones que antes. No hay comando decrbyfloat, pero el valor negativo de incremento puede lograr el efecto de resta.

3.3.11 strl

  • Formato: tecla STRLEN
  • Función: Devuelve la longitud del valor de cadena almacenado en la clave.
  • Descripción: cuando la clave no almacena un valor de cadena, devuelve un error; cuando la clave no existe, devuelve 0.

3.3.12 estrecho

  • Formato: tecla GETRANGE inicio fin
  • Función: devuelve la subcadena del valor de la cadena en la clave, el rango de intercepción de la cadena está determinado por las dos compensaciones de inicio y final, incluidos el inicio y el final.
  • Nota: el final debe ser mayor que el inicio. Se admiten compensaciones negativas, lo que significa contar desde el final de la cadena, -1 significa el último carácter, -2 significa el penúltimo carácter, y así sucesivamente.

3.3.13 establecer rango

  • Formato: valor de compensación de clave SETRANGE
  • Función: Reemplace el valor de cadena str almacenado por la clave dada con el parámetro de valor, comenzando desde el desplazamiento de desplazamiento.
  • Nota: Cuando el valor de compensación es mayor que la longitud de str, el medio se llena con cero bytes \x00, es decir, se llenan 0000 0000 bytes; la clave inexistente se trata como una cadena vacía.

3.3.14 Comandos de manipulación de bits

Los comandos que contienen BIT en el nombre son todos comandos para operar bits binarios, como setbit, getbit, bitcount, bittop y bitfield, y estos comandos no se usan comúnmente.

3.3.15 Escenarios de aplicación típicos

Hay muchos escenarios de aplicación en los que el valor es de tipo String. Estos son solo ejemplos de estos escenarios de aplicación típicos:

3.3.15.1 Caché de datos

Redis se usa como la capa de caché de datos y MySQL se usa como la capa de almacenamiento de datos. El servidor de aplicaciones primero obtiene datos de Redis. Si no hay datos en la capa de caché, los datos se obtienen de MySQL, se almacenan en la capa de caché y luego se devuelven al servidor de aplicaciones.

3.3.15.2 Contadores

Escriba una clave cuyo valor sea un valor numérico en Redis como contador de plataforma, contador de reproducción de video, etc. Cada vez que un cliente válido visita, o cada vez que se reproduce un video, el contador en Redis se modifica directamente y luego se conserva en otras fuentes de datos de manera asíncrona, como MySQL.

3.3.15.3 Compartir sesiones


Para un sistema de aplicaciones distribuidas, si los datos de la sesión, como la información de inicio de sesión del usuario, se guardan en el servidor que proporciona servicios de inicio de sesión, entonces si el usuario vuelve a enviar solicitudes como el cobro y el pago, pueden surgir problemas: al proporcionar servicios como el cobro y el pago El servidor no tiene los datos de la sesión del usuario, por lo que el usuario debe iniciar sesión nuevamente. Para los usuarios, esto es inaceptable.
En este punto, todos los datos de la sesión de todos los usuarios en el sistema se pueden guardar en Redis. Después de que el usuario envíe una nueva solicitud, el sistema primero buscará los datos de la sesión correspondiente en Redis. Si existe, realice las operaciones relacionadas, de lo contrario, vaya a la página de inicio de sesión. De esta manera no plantea el problema de "reinicio de sesión".

3.3.15.4 Limitador de velocidad

Hoy en día, para prevenir ataques DoS (Denial of Service, denegación de servicio), muchas plataformas generalmente restringen el acceso a una IP más de n veces en un segundo. Y Redis puede combinar el tiempo de caducidad de la clave y el comando incr para completar la función de límite de velocidad y actuar como limitador de velocidad.
Tenga en cuenta que no puede prevenir los ataques DDoS (Distributed Denial of Service).

// 客户端每提交一次请求,都会执行下面的代码

// 等价于set 192.168.192.55 1 ex 60 nx
// 指定新ip作为key的缓存过期时间为60秒
Boolean isExists = redis.set(ip, 1, “EX 60, “NX”);
if(isExists != null || redis.incr(ip) <= 5) {
    
    
    // 通过
} else {
    
    
    // 限流
}

3.4 Comando de operación de valor de tipo hash

El valor de los datos almacenados en Redis puede ser de tipo hash. El tipo Hash también se llama tabla Hash, diccionario, etc.
La tabla Hash es una tabla de mapeo Map, que también se compone de pares clave-valor. Para distinguirla de la clave general, la clave aquí se llama campo y el valor se llama valor. Tenga en cuenta que los pares de valor de campo en la tabla Hash de Redis son todos de tipo String.

3.4.1 hset

  • Formato: valor de campo clave HSET
  • Función: establece el valor del campo de campo en la clave de la tabla hash en valor.
  • Descripción: si la clave no existe, se crea una nueva tabla hash y se realiza HSET . Si el campo de campo ya existe en la tabla hash, se sobrescribirá el valor anterior. Devuelve 1 si el campo es un campo nuevo en la tabla hash y el valor se establece correctamente. Devuelve 0 si el campo ya existe en la tabla hash y el valor anterior se sobrescribió con el valor nuevo.

3.4.2 hget

  • Formato: campo clave HGET
  • Función: Devuelve el valor del campo de campo dado en la clave de la tabla hash.
  • Descripción: cuando el dominio dado no existe o la clave dada no existe, devuelve nil.

3.4.3 hmset

  • Formato: valor de campo de clave HMSET [valor de campo...]
  • Función: establezca varios pares de valor de campo (valor de campo) en la clave de la tabla hash al mismo tiempo.
  • Descripción: este comando sobrescribe los campos existentes en la tabla hash. Si la clave no existe, se crea una tabla hash vacía y se realiza la operación HMSET. Si el comando se ejecuta con éxito, devuelva OK. Devuelve un error cuando la clave no es de tipo hash.

3.4.4 hmget

  • Formato: campo clave HMGET [campo...]
  • Función: Devuelve los valores de uno o más campos en la clave de la tabla hash en el orden dado.
  • Descripción: Devuelve un valor nulo si el campo dado no existe en la tabla hash. Dado que una clave inexistente se trata como una tabla hash vacía, una operación HMGET en una clave inexistente devolverá una tabla con solo valores nulos.

3.4.5 hgetall

  • Formato: tecla HGETALL
  • Función: Devuelve todos los campos y valores en la clave de la tabla hash.
  • Explicación: en el valor devuelto, inmediatamente después de cada nombre de dominio (nombre de campo) se encuentra el valor del campo (valor), por lo que la longitud del valor devuelto es el doble del tamaño de la tabla hash. Si la clave no existe, devuelve una lista vacía. Si la clave contiene una gran cantidad de elementos, este comando puede bloquear el servicio Redis. Por lo tanto, este comando generalmente no se usa en el entorno de producción, sino que se usa el comando hscan en su lugar.

3.4.6 hsetnx

  • Formato: valor de campo clave HSETNX
  • Función: establezca el valor del campo campo en la clave de la tabla hash en valor, si y solo si el campo campo no existe.
  • Nota: Si el campo de campo ya existe, esta operación no es válida. Si la clave no existe, se crea una nueva tabla hash y se ejecuta el comando HSETNX.

3.4.7 hdel

  • Formato: campo clave HDEL [campo...]
  • Función: elimine uno o más dominios especificados en la clave de la tabla hash y los dominios no existentes se ignorarán.
  • Descripción: Devuelve el número de dominios eliminados con éxito, excluyendo los dominios ignorados.

3.4.8 hexágonos

  • Formato: campo clave HEXISTS
  • Función: compruebe si el campo de campo dado existe en la clave de la tabla hash.
  • Descripción: Devuelve 1 si la tabla hash contiene el campo dado. Devuelve 0 si el campo dado no existe o si la clave no existe.

3.4.9 hincrby y hincrbyfloat

  • Formato: incremento de campo clave HINCRBY
  • Función: agrega incremento al valor del campo en la clave de la tabla hash. El comando hincrby solo puede incrementar valores enteros, mientras que hincrbyfloat puede incrementar valores decimales.
  • Nota: El incremento también puede ser un número negativo, que es equivalente a la operación de resta en el campo dado. Si la clave no existe, se crea una nueva tabla hash y se ejecuta el comando HINCRBY. Si el campo campo no existe, entonces el valor del campo se inicializa a 0 antes de ejecutar el comando. Ejecutar el comando HINCRBY en un campo que almacena valores de cadena provocará un error.

3.4.10 llaves y ballenas

  • Formato: tecla HKEYS o tecla HVALS
  • Función: Devuelve todos los campos/valores en la clave de la tabla hash.
  • Descripción: cuando la clave no existe, devuelve una tabla vacía.

3.4.11 cumplido

  • Formato: clave HLEN
  • Función: Devuelve el número de dominios en la clave de la tabla hash.
  • Descripción: Cuando la clave no existe, devuelve 0.

3.4.12 hstrlen

  • Formato: campo clave HSTRLEN
  • Función: Devuelve la longitud de la cadena (longitud de la cadena) del valor asociado con el campo de dominio dado en la clave de la tabla hash.
  • Descripción: si la clave o el campo proporcionado no existe, el comando devuelve 0.

3.4.13 Escenarios de aplicación

El valor de tipo hash es muy adecuado para almacenar datos de objetos. La clave es el nombre del objeto, y el valor es el Mapa que describe las propiedades del objeto.La modificación de las propiedades del objeto se puede hacer directamente en Redis. No es como un objeto de almacenamiento de valor de tipo cadena, ese objeto se serializa, por ejemplo, se serializa en una cadena JSON, la modificación del valor del atributo del objeto debe deserializarse en un objeto antes de la modificación y luego serializarse en una cadena JSON después. modificación Escribir en Redis.

3.5 Comando de operación de valor de tipo de lista

El valor de los datos almacenados en Redis puede ser un tipo de datos de lista de cadenas. Es decir, cada elemento de la lista es un dato de tipo String. Los datos de la lista se ordenarán en el orden de inserción. Sin embargo, la capa inferior de la lista es en realidad una lista doblemente enlazada sin un nodo principal, por lo que el rendimiento de la operación en la parte superior e inferior de la lista es alto, pero el rendimiento en la inserción y eliminación de elementos intermedios es relativamente bajo.

3.5.1 lempuje/empuje

  • 格式:valor de la clave LPUSH [valor...] 或 valor de la clave RPUSH [valor...]
  • Función: inserte uno o más valores en el encabezado/pie de página de la tecla de lista (el encabezado está a la izquierda y la cola está a la derecha)
  • Nota: si hay varios valores de valor, para lpush, cada valor se insertará en el encabezado en orden de izquierda a derecha; para rpush, cada valor se insertará al final de la tabla en orden de izquierda a derecha. Si la clave no existe, se crea una lista vacía y se realiza la operación. Devuelve un error cuando la clave existe pero no es un tipo de lista. Devuelve la longitud de la lista en caso de éxito.

3.5.2 cortina

  • Formato: llave LLEN
  • Función: Devuelve la longitud de la clave de la lista.
  • Descripción: si la clave no existe, la clave se interpreta como una lista vacía y se devuelve 0. Devuelve un error si la clave no es un tipo de lista.

3.5.3 índice de línea

  • Formato: índice de clave LINDEX
  • Función: Devuelve el elemento cuyo subíndice es índice en la clave de la lista. Las listas se cuentan desde 0.
  • Explicación: si el valor del parámetro de índice no está dentro del rango de la lista (fuera de rango), devuelve nil.

3.5.4 conjunto

  • Formato: valor de índice de clave LSET
  • Función: Establece el valor del elemento cuyo subíndice clave es índice en la lista a valor.
  • Descripción: se devuelve un error cuando el parámetro de índice está fuera de rango o cuando se ejecuta LSET en una lista vacía (la clave no existe).

3.5.5 naranja

  • Formato: tecla LRANGE inicio parada
  • Función: Devuelve los elementos en el intervalo especificado [inicio, parada] en la clave de lista, que incluye dos puntos finales.
  • Nota: El subíndice de List comienza desde 0, es decir, 0 representa el primer elemento de la lista, 1 representa el segundo elemento de la lista, y así sucesivamente. También se pueden usar subíndices negativos, donde -1 representa el último elemento de la lista, -2 representa el penúltimo elemento de la lista, y así sucesivamente. Los valores de subíndice fuera de rango no causan un error. Si el índice de inicio es mayor que el índice más grande de la lista, LRANGE devuelve una lista vacía. Si el subíndice de parada es mayor que el subíndice máximo, Redis establecerá el valor de parada en el subíndice máximo.

3.5.6 lpushx y rpushx

  • Formato: valor de clave LPUSHX o valor de clave RPUSHX
  • Función: inserte el valor del valor en el encabezado/pie de página de la clave de lista, si y solo si la clave existe y es una lista.
  • Descripción: Cuando la clave no existe, el comando no hace nada. Si la ejecución tiene éxito, se emite la longitud de la tabla.

3.5.7 con lente

  • Formato: tecla LINSERT ANTES|DESPUÉS del valor pivote
  • Función: Inserta el valor del valor en la clave de la lista, antes o después del pivote del elemento.
  • Descripción: Cuando el elemento pivote no existe en la lista, no se realiza ninguna operación y se devuelve -1; cuando la clave no existe, la clave se considera una lista vacía, no se realiza ninguna operación y se devuelve 0; si la key no es un tipo de lista, se devuelve uno Error; si el comando tiene éxito, devuelve la longitud de la lista después de que se complete la operación de inserción.

3.5.8 lpop / rpop

  • Formato: tecla LPOP [recuento] o tecla RPOP [recuento]
  • Función: elimina los elementos de recuento de la cabeza/cola de la clave de lista y devuelve los elementos eliminados. contar el valor predeterminado 1
  • Descripción: Cuando la clave no existe, devuelve nil

3.5.9 blpop / brpop

  • Formato: tecla BLPOP [tecla...] tiempo de espera o tecla BRPOP [tecla...] tiempo de espera
  • Función: BLPOP/BRPOP es un comando emergente de bloqueo para la lista. Son versiones de bloqueo del comando LPOP/RPOP. Cuando no hay ningún elemento en la lista dada para abrir, el comando BLPOP/BRPOP bloqueará la conexión hasta que expire el tiempo de espera o se encuentre un elemento que pueda abrirse. Cuando se dan varios parámetros clave, cada lista se verifica a su vez de acuerdo con el orden de las claves de parámetro, y aparece el elemento principal de la primera lista no vacía. timeout es la duración del bloqueo en segundos.Si el valor es 0, significa que mientras no haya un elemento emergente, siempre se bloqueará.
  • Explicación: si no aparece ningún elemento dentro del tiempo especificado, devuelva un cero y el tiempo de espera. De lo contrario, devuelva una lista con dos elementos, el primer elemento es la clave a la que pertenece el elemento emergente y el segundo elemento es el valor del elemento emergente.

3.5.10 rpoplpush

  • Formato: destino de origen RPOPLPUSH
  • Función: Comando RPOPLPUSH para realizar las siguientes dos acciones dentro de un tiempo atómico:
  • Extraiga el último elemento (elemento final) en la fuente de la lista y devuélvalo al cliente.
  • Inserte el elemento emergente del origen en la lista de destinos como el elemento principal de la lista de destinos.

Si la fuente no existe, se devuelve el valor nil y no se realiza ninguna otra acción. Si el origen y el destino son iguales, el elemento al final de la lista se mueve al encabezado y ese elemento se devuelve.Este caso especial se puede considerar como una operación de rotación en la lista.

3.5.11 brpoplpush

  • Formato: tiempo de espera de destino de fuente BRPOPLPUSH
  • Función: BRPOPLPUSH es una versión de bloqueo de RPOPLPUSH. Cuando la fuente de la lista dada no está vacía, BRPOPLPUSH se comporta igual que RPOPLPUSH. Cuando el origen de la lista está vacío, el comando BRPOPLPUSH bloqueará la conexión hasta que se agote el tiempo de espera u otro cliente ejecute el comando LPUSH o RPUSH en el origen. timeout es la duración del bloqueo en segundos.Si el valor es 0, significa que mientras no haya un elemento emergente, siempre se bloqueará.
  • Explicación: si no aparece ningún elemento dentro del tiempo especificado, devuelva un cero y el tiempo de espera. De lo contrario, devuelva una lista con dos elementos, el primer elemento es el valor del elemento emergente y el segundo elemento es el tiempo de espera.

3.5.12 lrem

  • Formato: valor de recuento de claves LREM
  • Función: De acuerdo con el valor de la cuenta del parámetro, elimina los elementos de la lista que son iguales al valor del parámetro. El valor de count puede ser uno de los siguientes:
  • contar > 0: Buscar desde el principio hasta el final de la tabla, eliminar elementos iguales al valor, el número es contar.
  • count < 0: busca desde el final de la tabla hasta el encabezado de la tabla, elimina elementos iguales al valor, el número es el valor absoluto de count.
  • count = 0: Elimina todos los valores iguales a value de la tabla.
  • Descripción: Devuelve el número de elementos eliminados. Cuando la clave no existe, el comando LREM devuelve 0, porque la clave que no existe se considera una lista vacía (lista vacía).

3.5.13 litros

  • Formato: parada de inicio de tecla LTRIM
  • Función: Recortar una lista, es decir, dejar que la lista mantenga solo los elementos en el rango especificado, y los elementos que no estén en el rango especificado serán eliminados.
  • Explicación: Los parámetros start y stop del subíndice (índice) se basan en 0, es decir, 0 representa el primer elemento de la lista, 1 representa el segundo elemento de la lista, y así sucesivamente. También se pueden usar subíndices negativos, donde -1 representa el último elemento de la lista, -2 representa el penúltimo elemento de la lista, y así sucesivamente. Devuelve un error cuando la clave no es un tipo de lista. Si el subíndice inicial es mayor que el final del subíndice más grande de la lista (lista LLEN menos 1), o si inicio > detener, LTRIM devuelve una lista vacía porque LTRIM ya ha vaciado toda la lista. Si el subíndice de parada es más grande que el subíndice final, Redis establecerá el valor de parada a final.

3.5.14 Escenarios de aplicación

Hay muchos escenarios de aplicación en los que el valor es un tipo de lista y las funciones comerciales correspondientes se realizan principalmente mediante la construcción de diferentes estructuras de datos. Aquí solo resumimos los métodos de implementación de estas estructuras de datos, sin dar ejemplos específicos.

3.5.14.1 Pila

El efecto de estructura de datos de pila se puede realizar a través de lpush + lpop: primero en entrar, último en salir. Inserte datos del lado izquierdo de la lista a través de lpush y recupere datos del lado izquierdo de la lista a través de lpop. Por supuesto, el mismo efecto también se puede lograr mediante rpush + rpop, pero la operación se encuentra en el lado derecho de la lista.

3.5.14.2 Cola

El efecto de la estructura de datos de la cola se puede realizar a través de lpush + rpop: primero en entrar, primero en salir. Inserte datos del lado izquierdo de la lista a través de lpush y recupere datos del lado derecho de la lista a través de rpop. Por supuesto, el mismo efecto también se puede lograr a través de rpush + lpop, pero la dirección de operación es justo la opuesta.

3.5.14.3 Cola de mensajes de bloqueo

El efecto de cola de mensajes de bloqueo se puede lograr a través de lpush + brpop. Un cliente como productor de mensajes usa lpush para insertar datos del lado izquierdo de la lista, y varios clientes como consumidores de mensajes usan el bloqueo brpop para "apropiarse" de los datos al final de la lista para el consumo, lo que garantiza el equilibrio de carga y la alta disponibilidad. de consumo El tiempo de espera de brpop se establece en 0, lo que significa que mientras no haya datos para mostrar, se bloqueará para siempre.

3.5.14.4 Conjuntos finitos dinámicos

Las colecciones finitas se pueden lograr mediante lpush + ltrim. Agregue datos a la lista desde la izquierda de la lista mediante lpush y mantenga la finitud dinámica de la colección mediante ltrim. La gestión dinámica, como la eliminación del fondo de la empresa y las clases clave de la escuela, se puede realizar a través de este conjunto dinámico limitado. Por supuesto, también se puede lograr el mismo efecto a través de rpush + ltrim, pero la dirección de operación es justo la opuesta.

3.6 Establecer tipo de comando de operación de valor

El almacenamiento de datos Value of Redis puede ser una colección Set, y cada elemento de la colección es de tipo String. Set es muy similar a List, pero la diferencia es que los elementos de Set están desordenados y no son repetibles, mientras que List es ordenado y repetible.
La colección Set en Redis es similar a la colección Set en Java y su capa inferior es una tabla hash cuyo valor es nulo. Es precisamente por esto que se provoca el desorden y la irrepetibilidad.

3.6.1 triste

  • Formato: miembro clave SADD [miembro...]
  • Función: agregue uno o más elementos miembros a la clave de la colección y los elementos miembros que ya existen en la colección se ignorarán.
  • Explicación: si la clave no existe, cree una colección que contenga solo elementos miembro como miembros. Devuelve un error cuando la clave no es un tipo de colección.

3.6.2 miembros

  • Formato: clave SMEMBERS
  • Función: Devuelve todos los miembros en la clave establecida.
  • Nota: Una clave que no existe se considera una colección vacía. Si la clave contiene una gran cantidad de elementos, este comando puede bloquear el servicio Redis. Por lo tanto, este comando generalmente no se usa en el entorno de producción y, en su lugar, se usa el comando sscan.

3.6.3 tarjeta

  • Formato: tecla SCARD
  • Función: Devuelve la longitud de la colección Set
  • Descripción: Cuando la clave no existe, devuelve 0.

3.6.4 sismember

  • Formato: miembro clave SISMEMBER
  • Función: determina si el elemento miembro es miembro de la clave de conjunto.
  • Descripción: Devuelve 1 si el elemento miembro es miembro de la colección. Devuelve 0 si el elemento miembro no es miembro del conjunto o si la clave no existe.

3.6.5 movimientos

  • Formato: SMOVE fuente destino miembro
  • Función: Mueva el elemento miembro de la colección de origen a la colección de destino.
  • Descripción: si la colección de origen no existe o no contiene el elemento de miembro especificado, el comando SMOVE no hace nada y devuelve 0. De lo contrario, el elemento miembro se elimina de la colección de origen y se agrega a la colección de destino, y se devuelve 1. Cuando la colección de destino ya contiene el elemento miembro, el comando SMOVE simplemente elimina el elemento miembro en la colección de origen. Devuelve un error cuando el origen o el destino no es un tipo de colección.

3.6.6 promedio

  • Formato: miembro clave SREM [miembro ...]
  • Función: elimine uno o más elementos de miembro en la clave establecida, los elementos de miembro no existentes se ignorarán y devolverá la cantidad de elementos eliminados con éxito.
  • Descripción: cuando la clave no es un tipo de colección, se devuelve un error.

3.6.7 srandmember

  • Formato: clave SRANDMEMBER [recuento]
  • Función: Devuelve el conteo de elementos aleatorios en la colección. El valor predeterminado de conteo es 1.
  • Explicación: si count es un número positivo y menor que la longitud de la colección, devuelve una matriz que contiene elementos de recuento y los elementos de la matriz son diferentes. Si count es mayor o igual que la longitud de la colección, se devuelve la colección completa. Si count es negativo, devuelve una matriz que contiene el valor absoluto de los elementos de recuento, pero los elementos de la matriz pueden aparecer duplicados.

3.6.8 toques

  • Formato: tecla SPOP [recuento]
  • Función: eliminar y devolver elementos aleatorios de recuento en la colección. count debe ser un número positivo y el valor predeterminado es 1.
  • Descripción: si el recuento es mayor o igual que la longitud de la colección, elimine y devuelva la colección completa.

3.6.9 sdiff / tienda sdiff

  • Formato: clave SDIFF [clave...] o clave de destino SDIFFSTORE [clave...]
  • Función: Devuelve la diferencia entre el primer conjunto y otros conjuntos. Conjunto diferencia, diferencia.
  • Explicación: La diferencia entre estos dos comandos es que sdiffstore no solo puede mostrar la diferencia, sino también almacenar la diferencia en el destino establecido especificado. Si la colección de destino ya existe, se sobrescribe. Una clave que no existe se considera un conjunto vacío.

3.6.10 sinterización / sinterización

  • Formato: tecla SINTER [clave...] o clave de destino SINTERSTORE [clave...]
  • Función: Devuelve la intersección entre varias colecciones. Intersección, intersección.
  • Explicación: La diferencia entre estos dos comandos es que sinterstore no solo puede mostrar la intersección, sino también almacenar la intersección en el destino establecido especificado. Si la colección de destino ya existe, se sobrescribe. Una clave que no existe se considera un conjunto vacío.

3.6.11 sunión / tiendasol

  • Formato: clave SUNION [clave...] o clave de destino SUNIONSTORE [clave...]
  • Función: Devuelve la unión entre múltiples colecciones. Unión.
  • Explicación: La diferencia entre estos dos comandos es que sunionstore no solo puede mostrar la unión, sino también almacenar la unión en el destino de la colección especificada. Si la colección de destino ya existe, se sobrescribe. Una clave que no existe se considera un conjunto vacío.

3.6.12 Escenarios de aplicación

Hay muchos escenarios de aplicación en los que el valor es un tipo de conjunto, y estos escenarios solo se resumen aquí.

3.6.12.1 Listas blancas y negras dinámicas


Por ejemplo, se debe configurar una lista negra para el control de acceso en un servidor. Si la lista negra se escribe directamente en el archivo de configuración del servidor, el problema es que la lista negra no se puede modificar dinámicamente. En este momento, la lista negra se puede escribir directamente en Redis. Siempre que haya un cliente para acceder al servidor, el servidor primero verificará si la IP existe en la lista negra de Redis después de obtener la IP del cliente. Si existe, el acceso será denegado, de lo contrario el acceso pasará. .

3.6.12.2 Números aleatorios finitos

El número aleatorio limitado significa que el número aleatorio devuelto se basa en un número aleatorio dentro de un cierto rango establecido, como lotería y selección aleatoria. A través de spop o srandmember, los elementos se pueden seleccionar aleatoriamente de la colección especificada.

3.6.12.3 Retrato de usuario

Varias plataformas, como las plataformas sociales y las plataformas de comercio electrónico, que requieren que los usuarios se registren e inicien sesión, crearán retratos para cada usuario en función de la información proporcionada por el usuario y los hábitos de uso del usuario, es decir, definirán muchas etiquetas para cada usuario que pueden reflejan las características del usuario.La etiqueta se puede agregar a la colección correspondiente al usuario usando sadd. Estas etiquetas están desordenadas y no son repetitivas.
Al mismo tiempo, la plataforma también puede usar sinter/sinterstore para recomendar amigos, productos y clientes en función de la intersección de los retratos de los usuarios.

3.7 Comando de operación de valor de tipo de conjunto ordenado

El valor de los datos almacenados en Redis puede ser un conjunto ordenado, y cada elemento de este conjunto ordenado es de tipo cadena. La diferencia entre un conjunto ordenado y un conjunto es que cada elemento de un conjunto ordenado tiene una puntuación, y Redis ordenará el conjunto de menor a mayor según el valor de la puntuación. Tiene los mismos requisitos que la colección Set, no se pueden repetir los elementos, pero se puede repetir la puntuación de los elementos. Dado que todos los comandos de este tipo comienzan con la letra z, este Conjunto también se denomina ZSet.

3.7.1 Zadd

  • 格式:Miembro de puntaje clave de ZADD [[miembro de puntaje] [miembro de puntaje] …]
  • Función: agregue uno o más elementos de miembro y sus valores de puntuación a la posición adecuada en la clave del conjunto ordenado.
  • Descripción: el valor de la puntuación puede ser un valor entero o un número de punto flotante de precisión doble. Si la clave no existe, se crea un conjunto ordenado vacío y se realiza ZADD. Devuelve un error cuando la clave existe pero no es del tipo de conjunto ordenado. Si el comando tiene éxito, devuelve la cantidad de miembros nuevos que se agregaron correctamente, sin incluir los miembros existentes que se actualizaron. Si el valor del miembro escrito ya existe, pero el valor de la puntuación es diferente, el nuevo valor de la puntuación sobrescribirá la puntuación anterior.

3.7.2 zrange与zrevrange

  • Formato: tecla ZRANGE inicio parada [CON PUNTUACIONES] o tecla ZREVRANGE inicio parada [CON PUNTUACIONES]
  • Función: Devuelve los miembros en el intervalo especificado en la clave del conjunto ordenado. El comando zrange ordenará por valor de puntaje creciente, y el comando zrevrange ordenará por puntaje descendente. Los miembros con el mismo valor de puntuación se ordenan lexicográficamente/lexicográficamente a la inversa. Los miembros pueden ser devueltos con sus valores de puntaje usando la opción CON RESULTADOS.
  • Nota: El parámetro de subíndice comienza desde 0, es decir, 0 representa el primer miembro del conjunto ordenado, 1 representa el segundo miembro del conjunto ordenado, y así sucesivamente. También puede usar subíndices negativos, -1 para el último miembro, -2 para el penúltimo miembro, y así sucesivamente. Los subíndices fuera de rango no causan un error. Por ejemplo, cuando el valor de inicio es mayor que el subíndice más grande del conjunto ordenado, o inicio > detener, el comando ZRANGE simplemente devuelve una lista vacía. Para otro ejemplo, si el valor del parámetro de parada es mayor que el subíndice máximo del conjunto ordenado, Redis tratará la parada como el subíndice máximo.

Si el rango especificado en la clave contiene una gran cantidad de elementos, este comando puede bloquear el servicio Redis. Por lo tanto, si desea consultar todos los elementos en el conjunto ordenado en el entorno de producción, generalmente no usa este comando, sino que usa el comando zscan en su lugar.

3.7.3 zrangebyscore与zrevrangebyscore

  • Formato: tecla ZRANGEBYSCORE min max [WITHSCORES] [LIMIT offset count]

ZREVRANGEBYSCORE clave max min [WITHSCORES] [LIMIT offset count]

  • Función: devuelva todos los miembros cuyo valor de puntuación esté entre el mínimo y el máximo (incluido el mínimo o el máximo) en la clave del conjunto ordenado. Los miembros del conjunto ordenado se organizan en orden creciente o decreciente de valor de puntuación. Los miembros con el mismo valor de puntuación se ordenan lexicográficamente/lexicográficamente a la inversa. El parámetro LIMIT opcional especifica el número y el rango de resultados devueltos (como SELECT LIMIT offset, count en SQL). Tenga en cuenta que cuando el desplazamiento es grande, es posible que la operación de ubicar el desplazamiento deba atravesar todo el conjunto ordenado, que puede ser menor eficiente Bajo. El parámetro opcional WITHSCORES determina si el conjunto de resultados devuelve solo los miembros del conjunto ordenado o devuelve los miembros del conjunto ordenado y sus valores de puntuación juntos.
  • Nota: Los valores de min y max son más o menos infinito. De forma predeterminada, el valor del intervalo usa un intervalo cerrado (menor o igual que o mayor que o igual), y también se puede usar un intervalo abierto opcional (menor o mayor que) agregando un corchete izquierdo "(" antes del parámetro.

3.7.4 zcard

  • Formato: clave ZCARD
  • Función: Devuelve la longitud de la colección.
  • Descripción: Cuando la clave no existe, devuelve 0.

3.7.5 zcount

  • Formato: clave ZCOUNT min max
  • Función: devuelve el número de miembros cuyo valor de puntuación está entre el mínimo y el máximo (incluido el valor de puntuación igual al mínimo o al máximo de forma predeterminada) en la clave del conjunto ordenado.

3.7.6 puntuación z

  • Formato: miembro clave ZSCORE
  • Función: Devuelve el valor de puntuación del miembro miembro en la clave del conjunto ordenado.
  • Explicación: si el elemento miembro no es miembro de la clave del conjunto ordenado, o si la clave no existe, devuelve nil.

3.7.7 zincrby

  • Formato: miembro de incremento de clave ZINCRBY
  • Función: agrega incremento al valor de puntaje del miembro miembro de la clave del conjunto ordenado. El valor de incremento puede ser un valor entero o un número de coma flotante de precisión doble.
  • Nota: Puede restar el valor correspondiente de la puntuación pasando un incremento de valor negativo. Cuando la clave no existe, o el miembro no es miembro de la clave, el miembro de incremento de clave ZINCRBY es equivalente al miembro de incremento de clave ZADD. Devuelve un error cuando la clave no es del tipo de conjunto ordenado. Si el comando se ejecuta con éxito, se devolverá el nuevo valor de puntuación del miembro miembro.

3.7.8 zrank 与zrevrank

  • Formato: miembro clave ZRANK o miembro clave ZREVRANK
  • Función: Devuelve el rango del miembro miembro en la clave del conjunto ordenado. El comando zrank ordenará por valor de puntaje creciente y el comando zrevrank ordenará por puntaje descendente.
  • Explicación: La clasificación del miembro con el valor de puntuación más bajo es 0. Devuelve nil si el miembro no es miembro de la clave del conjunto ordenado.

3.7.9 edad

  • Formato: miembro clave ZREM [miembro...]
  • Función: elimine uno o más miembros en la clave del conjunto ordenado y los miembros no existentes se ignorarán.
  • Descripción: cuando la clave existe pero no es un tipo de conjunto ordenado, se devuelve un error. En caso de éxito, devuelve el número de miembros eliminados con éxito, excluyendo los miembros ignorados.

3.7.10 zremrangebyrank

  • Formato: tecla ZREMRANGEBYRANK inicio parada
  • Función: eliminar todos los miembros en el intervalo de rango especificado en la clave de conjunto ordenado.
  • Explicación: Los intervalos de clasificación se indican mediante los parámetros de subíndice start y stop, incluidos start y stop. El parámetro de intervalo de rango comienza en 0, es decir, 0 significa el miembro en primer lugar, 1 significa el miembro en segundo lugar, y así sucesivamente. También se pueden usar números negativos, -1 para el último miembro, -2 para el penúltimo miembro, y así sucesivamente. Si el comando se ejecuta con éxito, se devolverá el número de miembros eliminados.

3.7.11 zremrangebyscore

  • Formato: tecla ZREMRANGEBYSCORE min max
  • Función: elimine todos los miembros cuyo valor de puntaje esté entre el mínimo y el máximo (incluso igual al mínimo o al máximo) en la clave del conjunto ordenado.
  • Nota: Si el comando se ejecuta con éxito, se devolverá el número de miembros eliminados.

3.7.12 zrangebylex

  • Formato: tecla ZRANGEBYLEX mín. máx. [LÍMITE de recuento de compensaciones]
  • Función: este comando solo se aplica cuando todos los miembros del conjunto tienen la misma puntuación. Cuando todos los miembros de un conjunto ordenado tienen la misma puntuación, los elementos del conjunto ordenado se ordenan según el orden lexicográfico de los miembros. Es decir, este comando devuelve los miembros del conjunto dado cuyos valores de elementos están entre min y max. Si los miembros del conjunto ordenado tienen puntuaciones diferentes, el resultado de la ejecución del comando es el mismo que la tecla zrange.
  • Nota: Los parámetros mínimos y máximos legales deben contener paréntesis izquierdos "(" o corchetes izquierdos "[", donde los corchetes izquierdos "(" indican intervalos abiertos y los corchetes izquierdos "[" indican intervalos cerrados. min o max Los caracteres especiales "+" y "-" también se pueden usar para representar infinito positivo e infinito negativo respectivamente.

3.7.13 zexcount

  • Formato: clave ZLEXCOUNT min max
  • Función: este comando solo se aplica cuando todos los miembros del conjunto tienen la misma puntuación. Este comando devuelve el número de elementos en el conjunto cuyo valor de elemento en sí mismo (no el valor de puntuación) está dentro del rango de mínimo y máximo.

3.7.14 zremrangebylex

  • Formato: clave ZREMRANGEBYLEX min max
  • Función: este comando solo se aplica cuando todos los miembros del conjunto tienen la misma puntuación. Este comando elimina todos los elementos de la colección cuyos valores de elemento se encuentran dentro del rango de mínimo y máximo.

3.7.15 Escenarios de aplicación

El escenario de aplicación más típico de un conjunto ordenado es la lista de clasificación, como la lista de clasificación ordenada por el número de reproducciones en plataformas de música y video, la lista de clasificación ordenada por evaluación del usuario o volumen de ventas en la plataforma de comercio electrónico, etc. Utilice el volumen de reproducción como puntuación, la identificación de trabajo como miembro, los puntos de evaluación del usuario o el volumen de ventas como puntuación y la identificación del comerciante como miembro. Use zincrby para aumentar el puntaje de clasificación, use zrevrange para obtener los primeros, use zrevrank para consultar la clasificación actual, use zscore para consultar el puntaje de clasificación actual, etc.

Herramienta de prueba de referencia 3.8

3.8.1 Introducción

Después de instalar Redis, se instalará automáticamente una herramienta de prueba comparativa de Redis, que es una herramienta de prueba de estrés para probar el rendimiento de Redis.

Puede ver su uso a través del comando redis-benchmark –help: hay

muchas opciones. Usemos ejemplos para aprender el uso de las opciones de uso común.

3.8.2 Prueba 1

3.8.2.1 Análisis de comandos


El significado de las opciones en el comando anterior:

  • -h: Especificar la IP de Redis a probar, si es local se puede omitir
  • -p: Especificar el puerto de Redis a probar, si es 6379, se puede omitir
  • -c: especifica el número de clientes simulados, el valor predeterminado es 50
  • -n: Especifica el número total de solicitudes realizadas por estos clientes, el valor predeterminado es 100000
  • -d: especifica la longitud de datos del valor operado al probar el comando get/set, en bytes, y el valor predeterminado es 3. Esta especificación no es útil cuando se prueban otros comandos.

El significado del comando anterior es usar 100 clientes para conectarse a Redis, y estos clientes iniciarán un total de 100,000 solicitudes, y el valor de set/get es de 8 bytes de datos.

3.8.2.2 Análisis de resultados de pruebas

Este comando probará todos los comandos de Redis uno por uno, cada comando dará un informe de prueba y cada informe de prueba consta de cuatro partes:

3.8.2.2.1 Informe del entorno de prueba

El primero es el entorno de prueba:

3.8.2.2.2 Distribución del porcentaje de latencia

Este es un informe estadístico por porcentaje: se proporciona una estadística cada vez que se completa el 50% del volumen de prueba restante.

3.8.2.2.3 Distribución acumulativa de latencia

Este es un informe basado en estadísticas de intervalos de tiempo: básicamente cada 0,1 milisegundos.

3.8.2.2.4 Informe general

Este es un informe general.

3.8.3 Prueba 2


El significado de las opciones en el comando anterior:

  • -t: especifique el comando para probar, varios comandos están separados por comas, sin espacios
  • -q: especifica dar solo un informe resumido

3.9 SDS de cadena dinámica simple

3.9.1 Introducción a SDS

Ya sea Redis Key o Value, su tipo de datos básico es una cadena. Por ejemplo, los tipos de campo y valor del valor de tipo Hash, los tipos de elementos del tipo de lista, el tipo de conjunto y el valor de tipo ZSet son todos cadenas. Aunque Redis se desarrolla con el lenguaje C estándar, no usa directamente la representación tradicional de cadenas en el lenguaje C, sino que personaliza una cadena. La estructura de este tipo de cadena en sí es relativamente simple, pero su función es muy poderosa. Se llama cadena dinámica simple, cadena dinámica simple o SDS para abreviar.
Tenga en cuenta que no todas las cadenas en Redis son SDS, también aparecen cadenas C. Las cadenas C solo pueden aparecer en la cadena "constantes literales", y esa cadena no se puede cambiar.
redisLog(REDIS_WARNNING, “sdfsfsafsafds”);

3.9.2 Estructura de SDS

SDS es diferente de las cadenas C. Una cadena C en sí misma es una secuencia de caracteres encerrados entre comillas dobles y terminados por un carácter nulo '\0'. Pero SDS es una estructura definida en src/sds.h en el directorio de instalación de Redis:

| struct sdshdr { // matriz de bytes, utilizada para guardar la cadena char buf[]; // el número de bytes utilizados en buf[], denominado longitud de SDS int len; // palabras no utilizadas en buf[] número de secciones int libre;





}
例如执行SET country “China”命令时,键country与值”China”都是SDS类型的,只不过一个是SDS的变量,一个是SDS的字面常量。”China”在内存中的结构如下:


Puede verse en la estructura anterior que el valor buf de SDS es en realidad una cadena C, incluido el carácter nulo '\0', que ocupa 6 bytes en total. Pero el len de SDS no contiene el carácter nulo '\0'.

La diferencia entre esta estructura y la anterior es que aquí hay 3 bytes de espacio sin usar.

3.9.3 Ventajas de SDS

La cadena C usa una matriz de caracteres con una longitud de Len + 1 para representar una cadena cuya longitud real es Len. La matriz de caracteres termina con un carácter nulo '\0' al final, que indica el final de la cadena. Esta estructura es simple, pero no puede cumplir con los requisitos de Redis en cuanto a funcionalidad, seguridad y eficiencia de cadenas.

3.9.3.1 Evitar el cuello de botella de rendimiento de "adquisición de longitud de cadena"

Para una cadena C, si desea obtener su longitud, debe recorrer toda la cadena para obtenerla. Para el recorrido de cadenas ultralargas, se convertirá en el cuello de botella de rendimiento del sistema.
Sin embargo, dado que los datos de longitud de la cadena se almacenan directamente en la estructura SDS, el rendimiento del sistema necesario para obtener la longitud de la cadena no tiene nada que ver con la longitud de la cadena en sí y no se convertirá en un cuello de botella de rendimiento de Redis.

3.9.3.2 Garantizar la seguridad binaria

Una cadena C solo puede contener caracteres que se ajusten a un determinado formato de codificación, como ASCII, UTF-8, etc., y el carácter nulo '\0' no puede estar contenido en otras posiciones excepto al final de la cadena; de lo contrario, la cadena será eliminado Programa malinterpretado como finalizando prematuramente. Es muy común usar el carácter nulo '\0' como delimitador en datos binarios como imágenes, audio, video, archivos comprimidos y archivos de Office. Por lo tanto, los datos binarios como imágenes, audio, video, archivos comprimidos y archivos de oficina no se pueden almacenar en cadenas C.
Sin embargo, SDS no usa el carácter nulo '\0' como el final de la cadena, usa el atributo len para determinar si la cadena termina. Por lo tanto, para que el programa procese los datos de cadena en SDS, no es necesario realizar restricciones, filtros o suposiciones sobre los datos, solo léalos. Lo que se escribe en los datos es lo que se lee.

3.9.3.3 Reducir los tiempos de reasignación de memoria

SDS adopta una estrategia de asignación previa de espacio y una estrategia de liberación de espacio perezoso para evitar problemas de reasignación de memoria.
La estrategia de asignación previa de espacio significa que cada vez que el SDS expande el espacio, el programa no solo asigna el espacio requerido, sino que también asigna espacio adicional no utilizado para reducir la cantidad de reasignaciones de memoria. El espacio adicional no utilizado asignado depende del valor del atributo len del SDS después de la expansión del espacio.

  • Si el valor del atributo len es inferior a 1M, el tamaño del espacio libre asignado sin usar es el mismo que el valor del atributo len.
  • Si el valor del atributo len es mayor o igual a 1M, entonces el tamaño del espacio libre no utilizado asignado se fija en 1M.

SDS adopta una estrategia de liberación espacial perezosa para la liberación espacial. Esta estrategia significa que si se acorta la longitud de la cadena SDS, el espacio adicional no utilizado no se liberará temporalmente, sino que se agregará de forma gratuita. Para reducir la cantidad de reasignaciones de memoria al expandir SDS más adelante.
Si desea liberar el espacio no utilizado de SDS, puede usar la función sdsRemoveFreeSpace() para liberarlo.

3.9.3.4 Compatible con funciones C

Redis proporciona muchas API de SDS para facilitar el desarrollo secundario de Redis de los usuarios. Para ser compatibles con las funciones de C, las cadenas en la matriz subyacente buf[] de SDS aún terminan con el carácter nulo '\0'.
Los dos lados que se compararán ahora, uno es SDS y el otro es una cadena C, en este momento, puede usar la función de lenguaje C
strcmp (sds_str->buf, c_str)

3.9.4 Funciones de operación de SDS de uso común

La siguiente tabla enumera algunas funciones de operación de SDS comúnmente utilizadas y sus descripciones de funciones.

función Descripcion funcional
sdsnuevo() Cree una SDS usando la cadena C especificada
sdsempty() Cree una SDS que no contenga ningún dato de cadena
sdsdup() Crear una copia de la SDS especificada
sdsfree() Liberar la SDS especificada
sdsclear() Borrar el contenido de la cadena de la SDS especificada
sdslen() Obtener el valor de longitud de espacio usado de la SDS especificada
sdsavail() Obtenga el valor gratuito del espacio no utilizado de la SDS especificada
sdsMakeRoomFor() Aumente el espacio libre de la SDS especificada en el tamaño especificado
sdsRemoveFreeSpace() Liberar el espacio libre de la SDS especificada
sdscat() Empalme la cadena C especificada al final de la cadena SDS especificada
sdscatsds() Empalme la cadena SDS especificada al final de otra cadena SDS especificada
sdscpy() Copie la cadena C especificada en la SDS especificada, sobrescribiendo el contenido de la cadena SDS original
sdsgrouzero() Extiende la cadena SDS a la longitud especificada. Esta expansión se rellena con el carácter nulo '\0'
sdsrange() Interceptar la cadena de caracteres dentro del rango especificado en la SDS especificada
sdstream() Eliminar todas las apariciones de todos los caracteres en la cadena C especificada en la SDS especificada
sdsemp() Compare si dos cadenas SDS dadas son iguales
sdstolow() Cambie todas las letras en la cadena SDS especificada a minúsculas
sdstoupper() Ponga todas las letras en la cadena SDS especificada en mayúsculas

3.10 El principio de implementación subyacente de las colecciones

La implementación subyacente del tipo Set en Redis usa directamente hashTable. Sin embargo, la implementación subyacente de las colecciones Hash, ZSet y List se ha diseñado especialmente para garantizar el alto rendimiento de Redis.

3.10.1 Dos opciones de implementación

对于Hash与ZSet集合,其底层的实现实际有两种:压缩列表zipList,与跳跃列表skipList。这两种实现对于用户来说是透明的,但用户写入不同的数据,系统会自动使用不同的实现。只有同时满足以配置文件redis.conf中相关集合元素数量阈值与元素大小阈值两个条件,使用的就是压缩列表zipList,只要有一个条件不满足使用的就是跳跃列表skipList。例如,对于ZSet集合中这两个条件如下:
  • El número de elementos de la colección es menor que el valor del atributo zset-max-ziplist-entries en redis.conf y su valor predeterminado es 128
  • El tamaño de cada elemento de la colección es más pequeño que el valor del atributo zset-max-ziplist-value en redis.conf y su valor predeterminado es de 64 bytes.

3.10.2 lista zip

3.10.2.1 ¿Qué es zipList?

Una zipList, comúnmente llamada lista comprimida, es una lista doblemente enlazada especialmente codificada para almacenar cadenas o números enteros. Su estructura de datos subyacente consta de tres partes: encabezado, entradas y final. Estas tres partes se almacenan consecutivamente en la memoria.

3.10.2.2 cabeza

head又由三部分构成:
  • zlbytes: 4 bytes, utilizados para almacenar la cantidad de bytes ocupados por la estructura de datos general de la lista zipList, incluida la longitud de los zlbytes.
  • zltail: 4 bytes, utilizados para almacenar el desplazamiento (byte) de la última entrada en zipList en toda la estructura de datos. La existencia de estos datos puede ubicar rápidamente la posición de entrada de cola de la lista para facilitar la operación.
  • zllen: 2 bytes, utilizados para almacenar el número de entradas contenidas en la lista. Dado que solo tiene 16 bits, el número máximo de entradas que puede contener zipList es 216-1 = 65535.

3.10.2.3 entradas

entries是真正的列表,由很多的列表元素entry构成。由于不同的元素类型、数值的不同,从而导致每个entry的长度不同。
每个entry由三部分构成:
  • prevlength: esta parte se utiliza para registrar la longitud de la entrada anterior para lograr un recorrido en orden inverso. La longitud predeterminada es de 1 byte. Siempre que la longitud de la entrada anterior sea inferior a 254 bytes, prevlength ocupa 1 byte, de lo contrario, se ampliará automáticamente a 3 bytes.
  • codificación: esta parte se utiliza para el tipo específico de datos detrás de la bandera. Si los datos son de tipo entero, la codificación tiene una longitud fija de 1 byte. Si los datos son de tipo cadena, la longitud de codificación puede ser de 1 byte, 2 bytes o 5 bytes. Diferentes longitudes de cadenas de datos corresponden a diferentes longitudes de codificación.
  • datos: los datos reales almacenados. El tipo de datos solo puede ser un tipo entero o un tipo de cadena. Diferentes datos ocupan diferentes longitudes de bytes.

3.10.2.4 fin

end contiene solo una parte, llamada zlend. Ocupando 1 byte, el valor se fija en 255, es decir, los bits binarios son todos 1, lo que indica el final de una lista zipList.

3.10.3 paquete de lista

Para ziplist, la implementación es complicada, para recorrer en orden inverso, cada entrada contiene la longitud de la entrada anterior, lo que provocará actualizaciones en cascada al modificar o insertar entradas en medio de ziplist. En el escenario de una alta operación de escritura simultánea, el rendimiento de Redis se verá extremadamente reducido. Para lograr un análisis más compacto, más rápido y una implementación más simple, la implementación de ziplist se reescribe y se denomina listPack.
En Redis 7.0, todas las zipLists se reemplazaron por listPack, pero por compatibilidad, los atributos relacionados de zipList también se conservan en la configuración.

3.10.3.1 ¿Qué es listPack?

listPack también es una lista doblemente enlazada especialmente codificada para almacenar cadenas o números enteros. Su estructura de datos subyacente también consta de tres partes: cabeza, entradas y final, y estas tres partes también se almacenan continuamente en la memoria.
La principal diferencia entre listPack y zipList radica en la estructura del encabezado y cada entrada. El final que indica el final de la lista es el mismo que el zlend de zipList, ocupa un byte y los 8 bits son 1.

3.10.3.2 cabeza

La cabeza consta de dos partes:

  • totalBytes: 4 bytes, utilizados para almacenar el número de bytes ocupados por la estructura de datos general de la lista listPack, incluida la longitud de totalBytes.
  • elemNum: 2 bytes, utilizado para almacenar el número de entradas contenidas en la lista. Su significado es el mismo que el de zllen en zipList.

En comparación con el encabezado de zipList, no hay zltail que registre el desplazamiento de la última entrada.

3.10.3.3 entradas

entries也是listPack中真正的列表,由很多的列表元素entry构成。由于不同的元素类型、数值的不同,从而导致每个entry的长度不同。但与zipList的entry结构相比,listPack的entry结构发生了较大变化。
其中最大的变化就是没有了记录前一个entry长度的prevlength,而增加了记录当前entry长度的element-total-len。而这个改变仍然可以实现逆序遍历,但却避免了由于在列表中间修改或插入entry时引发的级联更新。
每个entry仍由三部分构成:
  • codificación: esta parte se utiliza para el tipo específico de datos detrás de la bandera. Si los datos son de tipo entero, la longitud de codificación puede ser de 1, 2, 3, 4, 5 o 9 bytes. Diferentes longitudes de bytes tienen diferentes bits de identificación. Si los datos son de tipo cadena, la longitud de codificación puede ser de 1, 2 o 5 bytes. Diferentes longitudes de cadenas de datos corresponden a diferentes longitudes de codificación.
  • datos: los datos reales almacenados. El tipo de datos solo puede ser un tipo entero o un tipo de cadena. Diferentes datos ocupan diferentes longitudes de bytes.
  • element-total-len: Esta parte se utiliza para registrar la longitud de la entrada actual para el recorrido en orden inverso. Debido a su método de grabación especial, los datos de bytes que ocupa pueden ser de 1, 2, 3, 4 o 5 bytes.

3.10.4 lista de barcos

3.10.4.1 Qué es skipList

skipList, skip list, conocida como skip list, es una estructura de datos aleatorios basada en una lista enlazada paralela, que es simple de implementar y tiene una alta eficiencia de búsqueda. En pocas palabras, la lista de salto también es una especie de lista enlazada, pero agrega una función de salto a la lista enlazada. También es esta función de salto la que proporciona una mayor eficiencia en la búsqueda de elementos.

3.10.4.2 principio de skipList

Supongamos que hay una lista enlazada ordenada con nodos de cabeza y cola.

En esta lista vinculada, si desea encontrar ciertos datos, debe comparar uno por uno desde el principio hasta encontrar el nodo que contiene los datos, o encontrar el primer nodo más grande que los datos dados, o encontrar el último nodo final , los dos últimos Todos no se encuentran. Del mismo modo, cuando queremos insertar nuevos datos, tenemos que pasar por el mismo proceso de búsqueda para determinar la posición de inserción.
Para mejorar la eficiencia de la búsqueda, se agrega un puntero al nodo par para apuntar al siguiente nodo par.

De esta manera, todos los nodos pares se conectan a una nueva lista enlazada (denominada lista enlazada de alto nivel). Por supuesto, el número de nodos contenidos en la lista enlazada de alto nivel es solo la mitad de la lista enlazada original. lista. En este momento, cuando desee buscar ciertos datos, primero busque a lo largo de la lista vinculada de alto nivel. Cuando encuentre el primer nodo que es más grande que los datos que se van a buscar, vuelva inmediatamente a la lista enlazada original desde el nodo anterior del nodo grande a buscar. Por ejemplo, si desea insertar un dato 20, primero busque en la lista vinculada de (8, 19, 31, 42), busque el primer nodo 31 que sea mayor que 20 y luego busque el nodo anterior de 31 en el lista vinculada de alto nivel 19, y luego obtenga el siguiente valor de nodo 23 en la lista vinculada original. es mayor que 20, inserte 20 entre el nodo 19 y el nodo 23. Si la inserción es 25, que es mayor que el nodo 23, se insertará entre el nodo 23 y el nodo 31.
Obviamente, este método puede reducir el número de comparaciones y mejorar la eficiencia de la búsqueda. Si hay muchos elementos en la lista enlazada, para mejorar aún más la eficacia de la búsqueda, la lista enlazada original se puede construir como una lista enlazada de tres capas o una lista enlazada de nivel superior.

Cuanto mayor sea el nivel, mayor será la eficiencia de búsqueda.

3.10.4.3 Problemas

Este método de vincular jerárquicamente la lista vinculada mejora la eficacia de la búsqueda en principio, pero existe un problema en la operación real: dado que los elementos con números de serie fijos tienen un nivel fijo, cuando se agrega o elimina el elemento de la lista, esto conducirá a un gran ajuste del nivel general de elementos de la lista, pero esto inevitablemente reducirá en gran medida el rendimiento del sistema.
Por ejemplo, para una lista vinculada dividida en dos niveles, se puede especificar que los nodos impares sean listas vinculadas de alto nivel y los nodos pares sean listas vinculadas de bajo nivel. Para una lista enlazada dividida en tres niveles, se puede dividir según el número de serie del nodo y el resultado del módulo de 3. Sin embargo, si se inserta un nuevo nodo o se eliminan algunos nodos originales, la jerarquía se volverá a dividir de acuerdo con las reglas de división de la jerarquía original y el rendimiento del sistema se reducirá considerablemente.

3.10.4.4 Optimización de algoritmos

Para evitar los problemas anteriores, skipList adopta el método de asignación aleatoria de niveles. Es decir, después de determinar el nivel total, cada vez que se agregue un nuevo elemento, se le asignará un nivel aleatoriamente. Esta aleatoriedad resuelve el problema de la relación fija entre el número de serie del nodo y el nivel.

La figura anterior demuestra el proceso de asignación aleatoria de niveles a cada elemento durante la generación de la lista. Del proceso de creación e inserción de esta lista de saltos, se puede ver que la cantidad de niveles de cada nodo se asigna aleatoriamente, y una nueva inserción de un nodo no afectará la cantidad de niveles de otros nodos. Solo es necesario modificar los punteros antes y después del nodo insertado, sin ajustar muchos nodos. Esto reduce la complejidad de la operación de inserción.
skipList se refiere a que, además de la lista enlazada inferior 1, generará varias capas de listas enlazadas dispersas. Los punteros en estas listas enlazadas omiten algunos nodos, y cuanto más alto sea el nivel de la lista enlazada, más nodos se omiten. Al buscar datos, primero busque en la lista vinculada de alto nivel, luego bájela capa por capa y, finalmente, puede descender a la lista vinculada de primer nivel para determinar con precisión la ubicación de los datos. En este proceso, debido a que se saltan algunos nodos, se acelera la velocidad de búsqueda.

3.10.5 Lista rápida

3.10.5.1 ¿Qué es QuickList?

quickList, lista rápida, quickList en sí misma es una lista enlazada no circular bidireccional, y cada nodo de ella es una zipList. A partir de la versión Redis 3.2, para la implementación subyacente de List, se usa quickList en lugar de zipList y linkedList.
Tanto zipList como linkedList tienen deficiencias evidentes, y quickList las mejora: absorbe las ventajas de zipList y linkedList, evitando sus deficiencias.
quickList es esencialmente un híbrido de zipList y linkedList. Divide la lista vinculada en segmentos, cada segmento usa zipList para almacenar de forma compacta varios elementos de datos reales, y varias zipLists se conectan en serie mediante punteros bidireccionales. Por supuesto, la capacidad máxima de elementos de datos que se pueden almacenar en cada zipList se puede especificar en el archivo de configuración a través del atributo list-max-ziplist-size.

3.10.5.2 Operación de recuperación

Para tener una comprensión más profunda del principio de funcionamiento de quickList, profundice la comprensión a través del análisis de la implementación de recuperación, inserción, eliminación y otras operaciones.
La recuperación de los elementos de la lista se basa en su índice de índice. quickList se compone de zipLists uno por uno, y el zllen de cada zipList registra la cantidad de entradas contenidas en la zipList actual, es decir, la cantidad de elementos de datos reales contenidos. De acuerdo con el índice del elemento a recuperar, comenzando desde el nodo principal de QuickList, sume los zllen de ZipList uno por uno hasta que se encuentre el primer zipList cuya suma sea mayor que el índice, entonces el elemento a recuperar es en esta lista zip.

3.10.5.3 Operación de inserción

由于zipList是有大小限制的,所以在quickList中插入一个元素在逻辑上相对就比较复杂一些。假设要插入的元素的大小为insertBytes,而查找到的插入位置所在的zipList当前的大小为zlBytes,那么具体可分为下面几种情况:
  • Caso 1: cuando insertBytes + zlBytes <= list-max-ziplist-size, simplemente inserte directamente en la posición correspondiente en zipList
  • Caso 2: cuando insertBytes + zlBytes > list-max-ziplist-size, y la posición de inserción está en el encabezado de zipList, debe verificar el tamaño prev_zlBytes de la zipList anterior de zipList.
  • Si insertBytes + prev_zlBytes<= list-max-ziplist-size, simplemente inserte el elemento directamente al final de la zipList anterior
  • Si insertBytes + prev_zlBytes> list-max-ziplist-size, cree directamente el elemento en sí mismo en una nueva zipList y conéctelo a la lista rápida
  • Caso 3: cuando insertBytes + zlBytes > list-max-ziplist-size, y la posición de inserción está al final de zipList, debe verificar el tamaño next_zlBytes de la siguiente zipList de zipList.
  • Si insertBytes + next_zlBytes<= list-max-ziplist-size, simplemente inserte el elemento directamente en la posición principal de la siguiente zipList
  • Si insertBytes + next_zlBytes> list-max-ziplist-size, cree directamente el elemento en sí mismo en una nueva zipList y conéctelo a la lista rápida
  • Situación 4: cuando insertBytes + zlBytes > list-max-ziplist-size, y la posición de inserción está en el medio de zipList, divida la zipList actual en dos zipLists y conéctelas a la lista rápida, y luego inserte el elemento delante de la división La posición de la cola de zipList

3.10.5.4 Operación de borrado

Para la operación de eliminación, solo debe prestar atención a si todavía hay elementos en zipList después de eliminar el elemento en zipList correspondiente. Si no hay otros elementos, elimine zipList y conecte las dos zipLists antes y después.

3.10.6 El número de elementos en clave y valor

El diseño de las diversas estructuras de datos especiales de Redis descritas anteriormente no solo mejora en gran medida el rendimiento de Redis, sino que también hace que la cantidad de claves que Redis puede admitir y la cantidad de elementos que se pueden admitir en el valor establecido sea muy grande.

  • ‎Redis puede manejar hasta 232 claves (alrededor de 4200 millones) y se ha probado en la práctica que cada instancia de Redis puede manejar al menos 250 millones de claves.
  • Cada colección Hash, List, Set, ZSet puede contener 232 elementos.

3.11 Comandos de operación de mapa de bits

3.11.1 Introducción a mapa de bits

BitMap es un nuevo tipo de datos introducido en la versión 2.2.0 de Redis. Este tipo de datos es esencialmente una cadena binaria que contiene solo 0 y 1. Y todos sus comandos relacionados son operaciones en los bits binarios de esta cadena. Hay tres atributos que se utilizan para describir la cadena: clave, desplazamiento, bitValue.

  • key: BitMap es un tipo de dato Value en el key-value de Redis, por lo que el Value debe tener su clave correspondiente.
  • offset: cada dato de mapa de bits es una cadena, y cada carácter de la cadena tiene su índice correspondiente, que comienza a contar desde 0. El índice se llama el desplazamiento de cada carácter en el mapa de bits. El rango de valores de este desplazamiento es [0, 232-1], es decir, el valor máximo de este desplazamiento es 4G-1, es decir, 4294967295, más de 4200 millones.
  • bitValue: cada dato de mapa de bits es una cadena binaria que contiene solo 0 y 1, y el carácter en cada bit de desplazamiento se denomina valor bitValue del bit. El valor de bitValue es 0 o 1.

3.11.2 conjunto de bits

  • Formato: valor de compensación de clave SETBIT
  • Función: establece el valor para la posición de compensación de los datos de mapa de bits de la tecla dada. Su valor de retorno es el bitValue de la posición de compensación antes de la modificación
  • Nota: Al asignar un valor a un desplazamiento que no existe en la cadena de mapa de bits original, la cadena se estirará automáticamente para garantizar que pueda almacenar el valor en el desplazamiento especificado. Cuando los valores de cadena se estiran, las posiciones vacías se llenan con 0. Por supuesto, el valor establecido solo puede ser 0 o 1. Sin embargo, debe tenerse en cuenta que para las operaciones SETBIT que utilizan una compensación grande, el proceso de asignación de memoria puede provocar el bloqueo del servidor Redis.

3.11.3 obtener bit

Formato: Desplazamiento de tecla GETBIT
Función: Para el valor de cadena de mapa de bits almacenado en la clave, obtenga el valor de bit bitValue en el desplazamiento de desplazamiento especificado.
Descripción: cuando el desplazamiento es mayor que la longitud del valor de la cadena, o la clave no existe, devuelve 0 .

3.11.4 recuento de bits

  • Formato: tecla BITCOUNT [inicio] [fin]
  • Función: cuenta el número de bits establecidos en 1 en la cadena dada. En general, el alcance de las estadísticas es toda la cadena de mapa de bits proporcionada. Pero también puede especificar parámetros de inicio o fin adicionales para contar solo las cadenas en el rango de bytes especificado, incluidos el inicio y el final. Tenga en cuenta que las unidades de inicio y fin aquí son bytes, no bits, y cuentan desde 0.
  • Nota: Tanto los parámetros de inicio como los de finalización pueden usar valores negativos: -1 significa el último byte, -2 significa el penúltimo byte, y así sucesivamente. Además, la clave inexistente se trata como una cadena vacía, por lo que la operación BITCOUNT se realiza en una clave inexistente y el resultado es 0.

3.11.5 bits

  • Formato: bit de clave BITPOS [inicio] [fin]
  • Función: Devuelve la posición del primer bit binario cuyo valor es el bit de valor especificado (no 0 o 1) en el mapa de bits especificado por clave. pos, es decir, posición, posición. De forma predeterminada, el comando detectará todo el mapa de bits, pero los usuarios también pueden especificar el rango que se detectará mediante el parámetro de inicio y el parámetro de finalización opcionales.
  • Nota: Los significados de inicio y final son los mismos que los del comando bitcount.

3.11.6 bitup

  • Formato: Tecla de destino de operación BITOP [tecla...]
  • Función: realiza una operación binaria en una o más claves de cadena de mapa de bits y guarda el resultado en destkey.
  • La operación puede ser cualquiera de las cuatro operaciones AND, OR, NOT, XOR:
  • BITOP AND destkey key [key …] : realiza una operación AND bit a bit en uno o más mapas de bits y guarda el resultado en destkey .
  • BITOP OR destkey key [key …] : realiza una operación OR bit a bit en uno o más mapas de bits y guarda el resultado en destkey .
  • BITOP XOR destkey key [key …] : realiza una operación XOR bit a bit en uno o más mapas de bits y guarda el resultado en destkey .
  • BITOP NOT destkey key: Realiza una operación NOT bit a bit en el BitMap dado y guarda el resultado en destkey.
  • ilustrar:
  • Excepto por la operación NOT, todas las operaciones pueden aceptar uno o más mapas de bits como entrada.
  • Excepto por la operación NOT, otras operaciones en un mapa de bits son en realidad una copia.
  • Si varios mapas de bits involucrados en la operación tienen diferentes longitudes, el mapa de bits más corto utilizará 0 como bit adicional para operar con el mapa de bits más largo, y la longitud del resultado de la operación es la misma que la del mapa de bits más largo.

3.11.7 Escenarios de aplicación

Debido al amplio rango de valores de compensación, generalmente se aplica a estadísticas binarias de grandes volúmenes de datos. Por ejemplo, estadísticas de usuarios activos de la plataforma (binario: visita o no), estadísticas de tasa de soporte (binario: soporte o no), estadísticas de asistencia de empleados (binario: en servicio o fuera de servicio), binarización de imágenes (binario: blanco o negro), etc.
Sin embargo, para estadísticas binarias con una pequeña cantidad de datos, no es adecuado para BitMap y puede ser más apropiado usar Set. Por supuesto, la cantidad específica de datos es adecuada para usar Set, y la cantidad de datos en exceso es adecuada para usar BitMap, lo que requiere un análisis específico según escenarios específicos.
Por ejemplo, una plataforma quiere contar la cantidad de usuarios activos diarios.
Si usa Set para contar, solo necesita conectarse y escribir su ID de usuario en la colección Set. Finalmente, solo necesita contar la cantidad de elementos en la colección Set para completar las estadísticas. Es decir, el tamaño de la memoria ocupada por la colección Set es proporcional al número de usuarios en línea. Suponiendo que el ID de usuario tiene m bits y el número de usuarios activos es n, el tamaño del conjunto debe ser de al menos m n bytes.
Si usa BitMap para estadísticas, primero debe definir un BitMap, y los bits que ocupa son al menos la cantidad de usuarios registrados. Solo un usuario necesita conectarse, y una de las posiciones de bits se establece inmediatamente en 1 y, finalmente, las estadísticas se pueden completar contando el número de 1 en el mapa de bits. Es decir, el tamaño de la memoria que ocupa BitMap es proporcional a la cantidad de usuarios registrados y no tiene nada que ver con la cantidad de usuarios en línea. Suponiendo que el número de usuarios registrados en la plataforma es N, la longitud del BitMap es de al menos N bits, es decir, N/8 bytes.
¿Cuándo es más apropiado usar BitMap? Sea m
n bytes = N/8 bytes, es decir, cuando n = N/8/m = N/(8 m), el tamaño de memoria ocupado por la colección Set es el mismo que el de BitMap. Tomando a Taobao como ejemplo, la longitud de su ID de usuario es de 11 dígitos (m), y el número de usuarios registrados es de 800 millones (N). Cuando el número de usuarios activos es de 800 millones/(811) = 09 millones = 9*106 = 9 millones, la memoria ocupada por Set y BitMap es igual. Sin embargo, el promedio de usuarios activos diarios de Taobao es de 80 millones, por lo que es más apropiado que Taobao use BitMap.

3.12 Comando de operación HyperLogLog

3.12.1 Introducción a HyperLogLog

HyperLogLog es un nuevo tipo de datos introducido en la versión 2.8.9 de Redis, lo que significa registro de hiperregistro, registro de superregistro. Este tipo de datos puede entenderse simplemente como una colección de conjuntos cuyos elementos son cadenas. Pero, de hecho, HyperLogLog es un algoritmo de probabilidad de conteo de cardinalidad, mediante el cual se pueden completar las estadísticas de totales independientes con una memoria muy pequeña. Todos sus comandos relacionados son operaciones en esta "colección de conjuntos".

3.12.2 ruta

  • Formato: elemento clave PFADD [elemento ...]
  • Función: agregue cualquier cantidad de elementos a la colección HyperLogLog especificada. Devuelve 1 si se modificó el almacenamiento interno, 0 en caso contrario.

3.12.3 cuenta pf

  • Formato: tecla PFCOUNT [tecla...]
  • Función: Cuando este comando actúa sobre una sola clave, devuelve la cardinalidad aproximada de la colección HyperLogLog de la clave dada; cuando este comando actúa sobre varias claves, devuelve la cardinalidad aproximada de la unión de todas las colecciones HyperLogLog de la clave dada ; si la clave no existe, devuelve 0.

3.12.4 fusión

  • Formato:PFMERGE destkey sourcekey [sourcekey …]
  • Función: combine varias colecciones HyperLogLog en una colección HyperLogLog y guárdela en destkey. La cardinalidad del HyperLogLog combinado está cerca de la unión de todas las colecciones de HyperLogLog sourcekey.

3.12.5 Escenarios de aplicación

HyperLogLog puede realizar estadísticas de conteo de desduplicación inexactas en datos de registro extremadamente grandes. Eso sí, el error oficial que da Redis para esta inexactitud es del 0,81%. Este error está permitido para la mayoría de los escenarios de gran volumen de datos. Para los datos UV diarios de cada página de la plataforma, es muy adecuado utilizar HyperLogLog para el registro.

3.13 Comandos de operaciones geoespaciales

3.13.1 Introducción a Geoespacial

Geoespacial, espacio geográfico.
Redis presentó Geospatial, un nuevo tipo de datos en la versión 3.2. Este tipo sigue siendo una colección en esencia, pero el elemento de colección es especial y es una estructura de datos compuesta de tres partes. Esta estructura de datos se denomina elemento espacial:

  • Longitud: longitud. Las longitudes válidas son [-180, 180]. Positivo significa longitud este, negativo significa longitud oeste.
  • Latitud: latitud. Las latitudes válidas son [-85.05112878, 85.05112878]. Positivo indica latitud norte y negativo indica latitud sur.
  • Nombre de la ubicación: el nombre que se le da a la ubicación marcada por la latitud y la longitud, también conocido como el nombre del elemento espacial de la colección Geoespacial.

A través de este tipo, puede establecer y consultar la latitud y la longitud de una ubicación geográfica, consultar elementos espaciales dentro de un rango determinado y calcular la distancia entre dos elementos espaciales, etc.

3.13.2 geoagregar

  • 格式:GEOADD clave longitud latitud miembro [longitud latitud miembro …]
  • Función: Agregar uno o más elementos espaciales a la colección espacial especificada.
  • Descripción: este comando devuelve un error cuando el usuario intenta ingresar una longitud o latitud que está fuera de rango.

3.13.3 geopos

  • Formato: miembro clave GEOPOS [miembro ...]
  • Función: Devuelve la ubicación del elemento especificado desde el espacio geográfico especificado, es decir, la latitud y la longitud.
  • Nota: Debido a que el comando acepta una cantidad variable de elementos como entrada, el comando devuelve una matriz incluso si el usuario proporciona solo un elemento.

3.13.4 geodista

  • Formato: clave GEODIST miembro1 miembro2 [unidad]
  • Función: Devuelve la distancia entre dos posiciones dadas. Donde unidad debe ser una de las siguientes unidades:
  • m : metros, por defecto
  • km: kilómetro
  • mi: millas
  • pies: pies
  • Descripción: si una de las dos ubicaciones no existe, el comando devuelve un valor nulo. Además, los cálculos de distancia suponen que la Tierra es perfectamente esférica y, en el caso extremo, esta suposición introduce un error máximo del 0,5 %.

3.13.5 geohash

  • Formato: miembro clave GEOHASH [miembro...]
  • Función: Devuelve el valor de Geohash de uno o más elementos de ubicación.
  • Descripción: GeoHash es un método de codificación de direcciones. Puede codificar datos espaciales bidimensionales de longitud y latitud en una cadena. Este valor se usa principalmente para aplicaciones de bajo nivel o depuración y tiene poco efecto en la práctica.

3.13.6 georadius

  • 格式:GEORADIUS clave longitud latitud radio m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • Función: Con la latitud y longitud dadas como centro, devuelve los elementos cuya distancia desde el centro no exceda el radio dado entre todos los elementos de ubicación contenidos en el espacio geográfico especificado. También se puede llevar información adicional a la vuelta:
  • WITHDIST : al devolver el elemento de posición, también se devuelve la distancia entre el elemento de posición y el centro. La unidad de la distancia es consistente con la unidad de rango dada por el usuario.
  • WITHCOORD : también se devuelven la longitud y la dimensión del elemento de ubicación.
  • WITHHASH: También se devuelve el Geohash del elemento de posición, pero este hash se expresa en forma de número entero

El comando devuelve elementos posicionales no ordenados de forma predeterminada. A través de los siguientes dos parámetros, el usuario puede especificar el método de clasificación de los elementos de posición devueltos:

  • ASC: Según la posición del centro, devuelve el elemento de posición en el camino de cerca a lejos.
  • DESC : Devuelve elementos posicionales de más lejano a más cercano, según la posición del centro.
  • Descripción: De forma predeterminada, este comando devuelve todos los elementos posicionales coincidentes. Aunque el usuario puede usar la opción CONTAR para obtener los primeros N elementos coincidentes, debido a que el comando puede necesitar procesar internamente todos los elementos coincidentes, al buscar en un área muy grande, incluso si la opción CONTAR se usa para obtener un elemento de número pequeño, el comando también puede ejecutarse muy lentamente.

3.13.7 georadio por miembro

  • 格式:GEORADIUSBYMEMBER radio de miembro clave m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • Función: este comando es el mismo que el comando GEORADIUS, que puede encontrar los elementos dentro del rango especificado, pero el punto central de este comando lo proporciona la forma del elemento de posición, en lugar de usar la longitud y la latitud de entrada para especificar el centro punto como GEORADIUS.
  • Explicación: El resultado devuelto también contiene el elemento de la posición del punto central

3.13.8 Escenarios de aplicación

El significado de Geoespacial es ubicación geográfica, por lo que aplica principalmente cálculos relacionados con la ubicación geográfica. Por ejemplo, la función "cerca" en el descubrimiento de WeChat, la función "radar más amigo" en la adición de amigos, la función "cerca" en la dinámica QQ, la función "registrar" en DingTalk, etc.

3.14 Comandos de publicación/suscripción

3.14.1 Sistema de mensajes


La publicación/suscripción, o publicación/suscripción, es un modo de comunicación de mensajes: los publicadores, también conocidos como productores de mensajes, producen y envían mensajes a los sistemas de almacenamiento; los suscriptores, también conocidos como consumidores de mensajes, reciben y consumen mensajes de los sistemas de almacenamiento. Este sistema de almacenamiento puede ser un sistema de archivos FS, un middleware de mensajes MQ, un sistema de gestión de datos DBMS o Redis. El editor de mensajes completo, el suscriptor y el sistema de almacenamiento se denomina sistema de mensajes.
Después de que un suscriptor en el sistema de mensajes se suscriba a un cierto tipo de mensaje, mientras exista el tipo de mensaje en el sistema de almacenamiento, puede recibir y consumir estos mensajes continuamente. Cuando no existe dicho mensaje en el sistema de almacenamiento, se bloquea la recepción y el consumo del suscriptor. Y cuando el editor escriba el mensaje en el sistema de almacenamiento, despertará al suscriptor de inmediato. Cuando el sistema de almacenamiento está lleno, diferentes editores tienen diferentes métodos de procesamiento: algunos bloquearán la publicación del editor, esperando el espacio de almacenamiento disponible, algunos perderán los mensajes redundantes.
Por supuesto, los diferentes mensajes del sistema de mensajes se publican/suscriben de diferentes maneras. Por ejemplo, en un sistema de mensajería compuesto por middleware de mensajería como RocketMQ y Kafka, los mensajes publicados/suscritos se clasifican por tema. En el sistema de mensajes compuesto por Redis, los mensajes de publicación/suscripción se clasifican por Canal.

3.14.2 suscribirse

  • Formato: SUSCRÍBETE canal [canal...]
  • Función: el cliente de Redis puede suscribirse a cualquier cantidad de canales al mismo tiempo a través de un comando de suscripción. Después de generar el tema suscrito, el comando se bloquea y espera los mensajes del canal correspondiente.

3.14.3 psubscribirse

  • Formato: patrón PSUBSCRIBE [patrón...]
  • Función: Suscribirse a uno o más canales que coincidan con un patrón determinado.
  • Nota: El patrón aquí solo puede usar comodines  . Por ejemplo,  puede coincidir con todos los canales que comienzan con it, como it.news, it.blog, it.tweets, etc.; news.* puede coincidir con todos los canales que comienzan con news., como news.global.today, news.it , etc .

3.14.4 publicar

  • Formato: PUBLICAR mensaje de canal
  • Función: el cliente de Redis puede publicar un mensaje de canal a través de un comando de publicación. El valor de retorno es el número de suscriptores que recibieron el mensaje.

3.14.5 darse de baja

  • Formato: UNSUBSCRIBE [canal [canal...]]
  • Función: el cliente de Redis se da de baja del canal especificado.
  • Nota: Si no se especifica ningún canal, es decir, se ejecuta un comando UNSUBSCRIBE sin parámetros, se darán de baja todos los canales suscritos por el cliente mediante el comando SUBSCRIBE. En este caso, el comando devuelve un mensaje que informa al cliente de todos los canales no suscritos.

3.14.6 punsubscribe

  • Formato: PUNSUBSCRIBE [patrón [patrón...]]
  • Función: Darse de baja de uno o más canales que coincidan con el patrón dado.
  • Nota: El patrón aquí solo puede usar el comodín *. Si no se especifica ningún canal, el efecto es el mismo que el del comando SUBSCRIBE y el cliente cancelará la suscripción de todos los canales suscritos.

3.14.7 pubsub

  • Formato: PUBSUB [argumento [argumento...]]
  • Función: PUBSUB es un conjunto de comandos de introspección para ver el estado del sistema de suscripción y publicación. Consta de varios subcomandos en diferentes formatos. El uso de estos subcomandos se presenta a continuación.

3.14.7.1 canales pubsub

  • Formato: CANALES PUBSUB [patrón]
  • Función: enumera todos los canales actualmente activos. Los canales activos son aquellos que tienen al menos un suscriptor.
  • Nota: El parámetro de patrón es opcional. Si no se proporciona un argumento de patrón, se enumerarán todos los canales activos en el sistema de suscripción/publicación. Si se proporciona el argumento del patrón, solo se enumeran los canales activos que coinciden con el patrón dado. Solo se puede usar el comodín * en el patrón.

3.14.7.2 pubsub subnumero

  • Formato: PUBSUB NUMSUB [canal-1 … canal-N]
  • Función: Devuelve el número de suscriptores de un canal determinado. Devuelve una lista vacía si no se proporcionan canales.

3.14.7.3 alquileres pubsub

  • Formato: PUBSUB NUMPAT
  • Función: consulta la suma del número de todos los modos de canal suscritos por todos los clientes Redis actuales

3.15 Transacciones Redis

La esencia de las transacciones de Redis es el procesamiento por lotes de un conjunto de comandos. Este grupo de comandos se ejecutará secuencialmente y todos a la vez durante la ejecución, mientras no haya errores de sintaxis, este grupo de comandos no se interrumpirá durante la ejecución.

3.15.1 Funciones de transacción de Redis

Las transacciones de Redis solo garantizan la consistencia de los datos y no tienen las mismas características ACID que DBMS.

  • La falla de ejecución de algunos comandos en este grupo de comandos no afectará la ejecución de otros comandos y no provocará una reversión. Es decir, no es atómico.
  • Este conjunto de comandos implementa un aislamiento simple a través del bloqueo optimista. No hay niveles de aislamiento complicados.
  • Los resultados de la ejecución de este grupo de comandos se escriben en la memoria y si son persistentes depende de la estrategia de persistencia de Redis y no tiene nada que ver con las transacciones.

3.15.2 Implementación de transacciones de Redis

3.15.2.1 Tres comandos

Las transacciones de Redis se controlan a través de tres comandos.

  • muti: transacción abierta
  • exec: ejecutar la transacción
  • descartar: cancelar la transacción

3.15.2.2 Uso básico

El siguiente es el uso de definir y ejecutar una transacción:

Después de ejecutar la transacción, acceda a la variable definida en la transacción y se modifica su valor.

El siguiente es un ejemplo de definición pero cancelación de una transacción:

Después de cancelar la transacción, los comandos de la transacción no se ejecutan.

3.15.3 Manejo de excepciones de transacciones de Redis

3.15.3.1 Errores de sintaxis

Cuando un comando en una transacción tiene un error de sintaxis, toda la transacción se cancelará durante la ejecución exec.

La pista para exec es que se ignoró exec y la transacción se canceló debido a un error anterior.
En este momento, acceda al valor de la edad y encuentre que todavía es 19 y no ha cambiado a 20 establecido en la transacción.

3.15.3.2 Excepción de ejecución

Si no hay ningún error de sintaxis en el comando de la transacción, pero ocurre una excepción durante la ejecución, la excepción no afectará la ejecución de otros comandos.

Ocurrió una excepción durante la ejecución del segundo comando en la transacción anterior. Dado que la puntuación no es un número entero, no se puede aumentar en 20. Pero esta excepción no afectará la correcta ejecución de los comandos anteriores y posteriores. Verifique los valores de puntaje y nombre, y descubra que es el resultado de una ejecución exitosa.

3.15.4 Mecanismo de aislamiento de transacciones de Redis

3.15.4.1 Por qué se necesita un mecanismo de aislamiento

En escenarios simultáneos, varios clientes pueden modificar los mismos datos.
Por ejemplo: Hay dos clientes C izquierda y C derecha, C izquierda necesita solicitar 40 recursos, C derecha necesita solicitar 30 recursos. Primero observaron la cantidad de recursos que se poseen actualmente, es decir, el valor de los recursos. Todo lo que vieron fueron 50, y todos sintieron que la cantidad de recursos podría satisfacer sus necesidades, por lo que modificaron la cantidad de recursos para ocupar los recursos. Pero el resultado es que el recurso está "sobrevendido".

Para resolver esta situación, la transacción de Redis implementa el aislamiento de ejecución bajo subprocesos múltiples a través del mecanismo de bloqueo optimista.

3.15.4.2 Implementación del aislamiento

Redis implementa el aislamiento de ejecución bajo subprocesos múltiples a través de transacciones y comandos de vigilancia.

La secuencia de tiempo de ejecución de los dos clientes anteriores es:

tiempo C a la izquierda C derecha
T1 ver recursos
T2 obtener recursos obtener recursos
T3 multi
T4 decrépita los recursos 40
T5 decrépita los recursos 30
T6 ejecutivo

3.15.4.3 Principio de implementación

Su proceso de ejecución interna es el siguiente:

  1. Cuando un cliente realiza un seguimiento de la clave, el sistema agregará un bloqueo optimista de versión a la clave e inicializará la versión. Por ejemplo, el valor inicial es 1.0.
  2. Posteriormente, el cliente C escribió la declaración de modificación de la clave en la cola de comandos de la transacción y, aunque no se ejecutó, leyó el valor y la versión de la clave y la guardó en la memoria caché actual del cliente. En este momento, se lee y guarda el valor inicial de la versión 1.0.
  3. Posteriormente, el cliente C modifica el valor de la clave, esta modificación no solo modifica el valor de la clave en sí, sino que también aumenta el valor de la versión, por ejemplo, cambiando la versión a 2.0, y registra la versión en la información de la clave. . .
  4. Posteriormente, el cliente C ejecuta exec y comienza a ejecutar los comandos en la transacción. Sin embargo, cuando ejecuta el comando para modificar la clave, el comando primero compara el valor de la versión guardado en la memoria caché del cliente actual y el valor de la versión en la información de la clave actual. Si la versión de caché es más pequeña que la versión de clave, significa que el valor de la clave almacenada en caché por el cliente está desactualizado y la operación de escritura puede destruir la coherencia de los datos si se ejecuta. Por lo tanto, la operación de escritura no se realiza.

Supongo que te gusta

Origin blog.csdn.net/f5465245/article/details/130869341
Recomendado
Clasificación