Conceptos básicos de Dark Horse Redis6 (Redis7 complementario)

Directorio de artículos

1. Información general

Resumen de notas:

  1. NoSQL: base de datos no relacional, la base de datos NoSQL proporciona un modelo de consulta y almacenamiento de datos diferente.
  2. Características de Redis:
    • Tipo clave-valor, el valor admite una variedad de estructuras de datos diferentes y tiene funciones ricas
    • Hilo único , cada comando es atómico ( la parte de red en Redis6.0 es multiproceso )
    • Baja latencia, rápido ( basado en memoria , multiplexación IO, buena codificación).
    • Admite persistencia de datos
    • Admite clúster maestro-esclavo y clúster de fragmentos
    • Admite clientes en varios idiomas
  3. Nuevas características de Redis:
    • Funciones de Redis
    • Cliente-desalojo
    • ACL v2
    • AOF de varias partes
    • ……

1.1NoSQL

NoSQL (Not Only SQL) es una clasificación amplia de bases de datos que representa un grupo de sistemas de gestión de bases de datos no relacionales. En comparación con las bases de datos relacionales tradicionales (como las bases de datos SQL), las bases de datos NoSQL proporcionan un modelo de consulta y almacenamiento de datos diferente.

imagen-20230613195756384

ilustrar:

  • Las bases de datos relacionales almacenan datos estructurados y pueden agregar restricciones y otras condiciones a cada tupla o campo.
  • Las bases de datos no relacionales almacenan datos no estructurados, generalmente en forma de pares clave-valor. Los datos almacenados son diversos y pueden ser documentos o fotografías.

imagen-20230613200143048

ilustrar:

  • Los datos almacenados en una base de datos relacional se pueden relacionar a través de una tercera tabla.
  • Los datos almacenados en bases de datos no relacionales no están relacionados entre sí.

imagen-20230613200308427

ilustrar:

  • Los datos almacenados en la base de datos relacional se pueden agregar, eliminar, modificar y verificar mediante declaraciones SQL.
  • Cada uno de los datos almacenados en bases de datos no relacionales tiene su propia forma de almacenar datos y las reglas de almacenamiento son diferentes.

imagen-20230613200445270

ilustrar:

  • Las bases de datos relacionales admiten las características ACID de las transacciones, incluidas la atomicidad, la coherencia, el aislamiento y la durabilidad.
  • El almacenamiento de bases de datos no relacionales no tiene transacciones

En general, la diferencia entre SQL y NoSQL se puede resumir en una tabla:

imagen-20230613201047986

1.2 Significado

Redis nació en 2009. Su nombre completo es RemoteDictionaryServer , un servidor de diccionario remoto, que es un dato NoSQL de valor clave basado en memoria.

característica:

  • Tipo clave-valor, el valor admite una variedad de estructuras de datos diferentes y tiene funciones ricas
  • Hilo único , cada comando es atómico (la parte de red en Redis6.0 es multiproceso)
  • Baja latencia, rápido (basado en memoria, multiplexación IO, buena codificación).
  • Admite persistencia de datos
  • Admite clústeres maestro-esclavo y clústeres fragmentados
  • Admite clientes en varios idiomas

1.3Nuevas funciones de Redis

Funciones de Redis

imagen-20230614144857010

ilustrar:

​ Funciones de Redis, una nueva forma de extender Redis a través de scripts del lado del servidor, donde las funciones se almacenan junto con los propios datos. En resumen, redis va a arrebatarle el trabajo a los scripts de Lua.

Cliente-desalojo

imagen-20230614144547112

ilustrar:

​ La cantidad de personas conectadas a Redis y el rendimiento se vuelven configurables

AOF de varias partes

imagen-20230614145100809

ilustrar:

La lectura y escritura asincrónicas ya no son un problema

ACL v2

imagen-20230614145248022

ilustrar:

​Gestión de permisos refinada, puede configurar contraseñas para el clúster, etc.

paquete de lista

imagen-20230614145351974

ilustrar:

​ listpack es una nueva estructura de datos utilizada para reemplazar ziplist. No hay configuración de ziplist en la versión 7.0 (solo algunos tipos de datos se utilizan como etapa de transición en la versión 6.0)

2. Casos de uso básicos

Resumen de notas:

  1. Instalar y ejecutar

    • En ventanas…

    • En contenedor Docker

      sudo docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf  --appendonly yes  --requirepass qweasdzxc
      
    • Usando la interfaz gráfica...

  2. Comandos comunes

    • Tipo de cadena:
      • 添加:SET、GET、MSET(conjunto múltiple)、MGET
      • Ejemplos: INCR (aumentar), INCRBY (aumentar por), INCRBYFLOAT (aumentar por flotador), SETNX (establecer si no existe), SETEX (establecer si expira)
    • Tipo de hash:
      • Adición: HSET, HGET, HMSET (conjunto de múltiples hash)
      • Ejemplo: HINCRBY (aumento de hash), HSETNX (conjunto de hash si no existe)
      • Consulta: HMGET (obtención múltiple de hash), HGETALL, HKEYS, HVALS
    • Tipo de lista:
      • Añadido: LPUSH, RPUSH
      • Eliminar: LPOP, RPOP, BLPOP y BRPOP: similar a LPOP y RPOP, excepto que espera el tiempo especificado cuando no hay elementos, en lugar de devolver nil directamente
      • Consulta: LARGO
    • Tipo de configuración:
      • Adición: SADD (adición de conjuntos)
      • Eliminar: SREM (establecer eliminar miembro)
      • Ejemplo: SINTER (establecer intersección), SUNION (establecer unión), SDIFF (establecer diferente)
      • 查询:SCARD (establecer cardinalidad), SISMEMBER (el conjunto es miembro), SMEMBERS (establecer miembros)
    • Tipo SortedSet, tipo BitMap, tipo HyperLogLog, tipo Stream, tipo GEO: consulte para obtener más detalles

2.1 Instalar y ejecutar

2.1.1 En el sistema Windows

Paso 1: descomprimir

imagen-20230129233953821

ilustrar:

Después de la instalación, se generarán los siguientes archivos

Ejemplo de inicio:

Paso 2: inicie el servidor

redis-server.exe redis.windows.conf

ilustrar:

  • Al iniciar el servidor, debe especificar el archivo de configuración de Redis

imagen-20230129231725581

  • Si no se agrega ningún elemento de configuración, se informará un error.

Aviso:

​Necesita agregar elementos de configuración de configuración

Paso 3: iniciar el cliente

1. Inicie el cliente

imagen-20230129231946828

ilustrar:

  • Si se inicia el servidor Redis, pero el mensaje Ejecutando en modo independiente no aparece, debe abrir el cliente para apagarlo.

    # 通过cmd打开客户端
    redis-cli.exe
    # 关闭客户端
    shutdown
    
  • imagen-20230614092524120

  • Ahora reinicie el servidor.

2. Reinicie el servidor

redis-server.exe redis.windows.conf

imagen-20230129232232850

ilustrar:

  • Exitoso después de reiniciar

2.1.2 En contenedor Docker

Paso 1: extraiga la imagen de Docker

sudo docker pull redis

Paso 2: inicie el servidor

sudo docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/redis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf  --appendonly yes  --requirepass qweasdzxc

Descripción: Explicación de parámetros

  • sudo docker run: Comando para ejecutar el contenedor Docker.
  • --restart=always: configura el contenedor para que se reinicie automáticamente al salir.
  • --log-opt max-size=100m: establezca el tamaño máximo de los archivos de registro del contenedor en 100 MB.
  • --log-opt max-file=2: establezca el número máximo de archivos de registro retenidos por el contenedor en 2.
  • -p 6379:6379: Asigne el puerto de servicio Redis del contenedor al puerto 6379 del host.
  • --name myredis: Especifique el nombre del contenedor como "myredis".
  • -v /home/redis/myredis/redis.conf:/etc/redis/redis.conf: monte el archivo de configuración de Redis en el host en /etc/redis/redis.confla ruta del contenedor.
  • -v /home/redis/myredis/data:/data: monte el directorio de datos en el host en /datala ruta del contenedor para datos persistentes de Redis.
  • -d redis: Especifique la imagen del contenedor que se ejecutará como "redis", que es la imagen proporcionada oficialmente por Redis.
  • redis-server /etc/redis/redis.conf: Especifique el servicio Redis que se ejecutará cuando se inicie el contenedor y pase la ruta del archivo de configuración de Redis.
  • --appendonly yes: Active el modo de persistencia AOF (Agregar solo archivo) de Redis y agregue la operación de escritura al archivo en el disco.
  • --requirepass qweasdzxc: Establezca la contraseña del servidor Redis en "qweasdzxc", es decir, se requiere una contraseña para acceder al servicio Redis.

Aviso:

Si necesita habilitar el servicio de acceso remoto de Redis, debe establecer una contraseña para Redis.

Paso 3: iniciar el cliente

redis-cli [options] [commonds]
redis-cli -h 127.0.0.1 -p 6739 -a qweasdzxc

Descripción: Explicación de parámetros

  • -h 127.0.0.1: Especifique la dirección IP del nodo redis que se conectará, el valor predeterminado es 127.0.0.1
  • -p 6379: Especifique el puerto del nodo redis que se conectará, el valor predeterminado es 6379
  • -a 123321: Especifique la contraseña de acceso para redis

Reponer:

  • ping: Realice una prueba de latidos con el servidor Redis y el servidor volverá normalmente.pong

    imagen-20230614100008454

2.1.3 Ejecutar el cliente de interfaz gráfica

Paso 1: Descarga el cliente

URL; lework/RedisDesktopManager-Windows: versión de RedisDesktopManager para Windows (github.com)

Descripción: resultado

imagen-20230614100656361

Paso 2: instalar

imagen-20230614101750314

ilustrar:

​ La instalación falló, necesita instalar la biblioteca de tiempo de ejecución para ejecutar Visual C++

Paso 3: ejecutar

imagen-20230614101716225

2.2 Comandos comunes

2.2.1 Descripción general

​ Redis es una base de datos clave-valor, la clave generalmente es de tipo String, pero el tipo de valor es variado:

imagen-20230614102046529

ilustrar:

Hay muchos tipos de datos en redis, ahora presentaremos los comandos de cada tipo por turno.

Para facilitar nuestro aprendizaje, Redis también agrupa comandos para operar diferentes tipos de datos. Puede ver diferentes comandos en el sitio web oficial ( https://redis.io/commands ):

imagen-20230614102229254

2.2.2 Comandos comunes

Las instrucciones generales son instrucciones que se pueden utilizar para algunos tipos de datos. Las más comunes incluyen:

  • LLAVES: Ver todas las claves que coinciden con la plantilla. No se recomienda su uso en equipos de entorno de producción.
  • DEL: eliminar una clave especificada
  • EXISTE: determina si la clave existe
  • EXPIRAR: Establezca el período de validez de una clave. La clave se eliminará automáticamente cuando expire el período de validez.
  • TTL: Verifique el período de validez restante de una LLAVE

ilustrar:

No sekeys recomienda su uso en equipos del entorno de producción porque Redis es de un solo subproceso. Si se encuentran muchos valores clave, provocará el bloqueo del subproceso.

Reponer:

  • Puede verificar el uso específico de un comando a través de ayuda [comando], por ejemplo:

imagen-20230614104350652

2.2.3Tipo de cadena

2.2.3.1 Descripción general

El tipo de cadena, es decir, el tipo de cadena, es el tipo de almacenamiento más simple en Redis.

Su valor es una cadena, pero según el formato de la cadena, se puede dividir en tres categorías:

  • cadena: cadena ordinaria
  • int: tipo entero, puede realizar operaciones de incremento y decremento automático
  • float: tipo de punto flotante, puede realizar operaciones de incremento y decremento automático

No importa qué formato sea, la capa inferior se almacena en forma de matriz de bytes, pero el método de codificación es diferente. El espacio máximo de tipo string no puede exceder los 512m.

imagen-20230614105622039

ilustrar:

En el tipo Cadena, la capa inferior de Redis se puede dividir en tres tipos para el almacenamiento, a saber, las cadenas se convertirán en bytes para el almacenamiento, los números y los números de punto flotante se convertirán en binarios para el almacenamiento.

2.2.3.2 Comandos comunes

1.Nuevo

  • SET: agregar o modificar un par clave-valor de tipo cadena existente
  • OBTENER: obtiene el valor del tipo de cadena según la clave
  • MSET (conjunto múltiple): agregue múltiples pares clave-valor de tipo cadena en lotes
  • MGET (obtención múltiple): obtiene múltiples valores de tipo cadena basados ​​en múltiples claves

ilustrar:

imagen-20230614110255240

  • El comando anterior se configuró correctamente

2. Autocrecimiento

  • INCR (aumentar): deja que una clave entera aumente en 1
  • INCRBY (aumentar en): Deje que una clave entera aumente por sí sola y especifique el tamaño del paso. Por ejemplo: incrby num 2 hace que el valor numérico aumente en 2.
  • INCRBYFLOAT (aumento por flotador): deja que un número de tipo de punto flotante aumente por sí solo y especifica el tamaño del paso

ilustrar:

imagen-20230614110142318

  • Cuando se utiliza el incremento automático, el número aumentará según sea necesario

3.Comandos combinados

  • SETNX (establecer si no existe): agregue un par clave-valor de tipo Cadena, siempre que la clave no exista; de lo contrario, no se ejecutará.
  • SETEX (establecer si expira): agregue un par clave-valor de tipo cadena y especifique el período de validez

ilustrar:

imagen-20230614110407699

  • Si la clave ya existe en Redis, la configuración falla.

2.2.3.3 Estructura clave

La clave de Redis permite que varias palabras formen una estructura jerárquica, separadas por ':', en el siguiente formato:

项目名:业务名:类型:id

ilustrar:

  • Este formato no es fijo, también puedes eliminar o agregar entradas según tus propias necesidades.

  • Por ejemplo, nuestro nombre de proyecto es heima, y ​​hay dos tipos de datos diferentes, usuario y producto, la clave la podemos definir así:

    user相关的key:heima:user:1
    product相关的key:heima:product:1
    

Si Valor es un objeto Java, como un objeto Usuario, puede serializar el objeto en una cadena JSON y almacenarlo:

LLAVE VALOR
hogar:usuario:1 ' {“id”:1, “nombre”: “Jack”, “edad”: 21} '
inicio:producto:1 ' {"id":1, "nombre": "Xiaomi 11", "precio": 4999} '

ilustrar:

imagen-20230614112528648

  • Después de utilizar el :método de agrupación de Redis, podrá ver las herramientas de visualización y crear grupos para nosotros.

2.2.4 Tipo de hash

2.2.4.1 Descripción general

​ Tipo hash, también llamado hash, su valor es un diccionario desordenado, similar a la estructura HashMap en Java. La estructura String consiste en serializar el objeto en una cadena JSON y almacenarlo, lo que resulta muy inconveniente cuando es necesario modificar un determinado campo del objeto:

imagen-20230614113616359

La estructura Hash puede almacenar cada campo en el objeto de forma independiente y CRUD se puede realizar en un solo campo:

imagen-20230614113627488

2.2.4.2 Comandos comunes

1.Nuevo

  • Valor del campo de clave HSET: agregue o modifique el valor del campo de la clave de tipo hash
  • Campo de clave HGET: obtiene el valor del campo de una clave de tipo hash
  • HMSET (conjunto múltiple de hash): agregue valores de campo de múltiples claves de tipo hash en lotes

ilustrar:

imagen-20230614114103605

  • HMSET se eliminará porque el efecto es HSET similar a

2. Autocrecimiento

  • HINCRBY (aumento de hash): permite que el valor del campo de una clave de tipo hash se incremente automáticamente y especifica el tamaño del paso

ilustrar:

imagen-20230614114545412

  • Puedes ver el valor de edad y el crecimiento aquí.

3.Comandos combinados

  • HSETNX (conjunto de hash si no existe): agregue un valor de campo clave de tipo hash, siempre que el campo no exista; de lo contrario, no se ejecutará

ilustrar:

imagen-20230614114744698

  • La clave con el valor clave aquí ljtxy:product"1ya tiene el campo de edad, por lo que la configuración falla.

4.Consulta

  • HMGET (obtención de hash múltiple): obtiene los valores de campo de múltiples claves de tipo hash en lotes
  • HGETALL: obtiene todos los campos y valores en una clave de tipo hash
  • HKEYS: obtiene todos los campos en una clave de tipo hash
  • HVALS: obtiene todos los valores en una clave de tipo hash

2.2.5Tipo de lista

2.2.5.1 Descripción general

El tipo Lista en Redis es similar a LinkedList en Java y puede considerarse como una estructura de lista doblemente vinculada. Admite tanto búsqueda directa como inversa .

Las características también son similares a LinkedList:

  • ordenado
  • Los elementos se pueden repetir.
  • Inserción y eliminación rápidas
  • La velocidad de consulta es promedio

Comúnmente utilizado para almacenar datos ordenados, como: círculo de amigos como lista, lista de comentarios, etc.

imagen-20230614141655219

2.2.5.2 Comandos comunes

1.Nuevo

  • Elemento clave LPUSH…: Inserta uno o más elementos a la izquierda de la lista
  • Elemento clave RPUSH…: Inserta uno o más elementos en el lado derecho de la lista

Descripción: resultado

imagen-20230614140916366

2.Eliminar

  • Clave LPOP: elimina y devuelve el primer elemento en el lado izquierdo de la lista, o devuelve nil si no hay ninguno

  • Clave RPOP: elimina y devuelve el primer elemento en el lado derecho de la lista

  • BLPOP y BRPOP: similares a LPOP y RPOP, excepto que esperan el tiempo especificado cuando no hay elementos en lugar de devolver nil directamente.

ilustrar:

imagen-20230614140955947

  • Similar a esperar el tiempo de retraso especificado, si se agota el tiempo, devuelve cero

3. Consulta

  • LRANGE extremo de estrella clave: devuelve todos los elementos dentro de un rango de estrellas clave

Descripción: resultado

imagen-20230614141129176

2.2.6 Tipo de configuración

2.2.6.1 Descripción general

La estructura Set de Redis es similar al HashSet en Java, que puede considerarse como un HashMap cuyo valor es nulo. Debido a que también es una tabla hash , tiene características similares a HashSet :

  • trastorno
  • Los elementos no se pueden repetir
  • Encuentra rápido
  • Admite intersección, unión, diferencia y otras funciones.

2.2.6.2 Comandos comunes

1.Nuevo

  • Miembro clave SADD (adición de conjunto): agrega uno o más elementos al conjunto

2.Eliminar

  • Miembro clave SREM (conjunto de eliminación de miembros)...: Elimina el elemento especificado en el conjunto.

3. Cruz y diferencia

  • SINTER (establecer intersección) clave1 clave2 ...: Encuentra la intersección de clave1 y clave2
  • SUNION (establecer unión) clave1 clave2...: Encuentra la unión de clave1 y clave2
  • SDIFF (establecer diferente) clave1 clave2 ...: Encuentra la diferencia establecida entre clave1 y clave2

ilustrar:

imagen-20230614142107995

4.Consulta

  • Tecla SCARD (establecer cardinalidad): devuelve el número de elementos del conjunto
  • Miembro clave SISMEMBER (el conjunto es miembro): determina si un elemento existe en el conjunto
  • SMEMBERS (miembros del conjunto): obtiene todos los elementos del conjunto

2.2.7Tipo de conjunto ordenado

2.2.7.1 Descripción general

SortedSet de Redis es una colección de conjuntos ordenables, que es algo similar a TreeSet en Java, pero la estructura de datos subyacente es muy diferente. Cada elemento en SortedSet tiene un atributo de puntuación, y los elementos se pueden ordenar según el atributo de puntuación. La implementación subyacente es una lista de omisión (SkipList) más una tabla hash.

SortedSet tiene las siguientes propiedades:

  • Ordenable
  • Los elementos no se repiten.
  • La velocidad de consulta es rápida

Debido a la naturaleza ordenable de SortedSet, a menudo se usa para implementar funciones como tablas de clasificación.

2.2.7.2 Comandos comunes

1.Nuevo

  • Miembro de puntuación clave de ZADD [miembro de puntuación]: agregue uno o más elementos al conjunto ordenado y actualice su valor de puntuación si ya existe

ilustrar:

imagen-20230620151511322

  • nuevo valor

2.Eliminar

  • Miembro clave de ZREM: eliminar un elemento específico en el conjunto ordenado

ilustrar:

imagen-20230614150456735

  • Eliminar valor

3. Cruz y diferencia

  • ZDIFF, ZINTER, ZUNION: encontrando diferencias, intersecciones y uniones

3. Consulta

  • Miembro clave ZSCORE: obtiene el valor de puntuación del elemento especificado en el conjunto ordenado
  • Miembro clave ZRANK: obtiene la clasificación del elemento especificado en el conjunto ordenado
  • Tecla ZCARD: obtiene el número de elementos en el conjunto ordenado
  • Tecla ZCOUNT min max: cuenta el número de todos los elementos cuyo valor de puntuación está dentro de un rango determinado
  • Miembro de incremento de clave ZINCRBY: permite que el elemento especificado en el conjunto ordenado aumente en el valor de incremento especificado.
  • Clave ZRANGE min max: después de ordenar por puntuación, obtenga los elementos dentro del rango de clasificación especificado

ilustrar:

imagen-20230614150601016

  • rango significa devolver el elemento correspondiente
  • Clave ZRANGEBYSCORE min max: después de ordenar por puntuación, obtenga los elementos dentro del rango de puntuación especificado

ilustrar;

imagen-20230614150818837

  • rangbyscore obtiene los elementos ordenados en el rango especificado

2.2.7.3 Escenarios de aplicación

2.2.8Tipo de mapa de bits

2.2.8.1 Descripción general

​ Un tipo de datos de estado binario estadístico implementado con el tipo String como estructura de datos subyacente. Un mapa de bits es esencialmente una matriz, que es una operación bit a bit basada en el tipo de datos String. La matriz consta de bits, cada uno de los cuales corresponde a un desplazamiento (lo llamamos índice). El número máximo de bits admitidos por Bitmap es 2 32 bits, lo que puede ahorrar mucho espacio de almacenamiento. Puede almacenar hasta 4,29 mil millones de bytes de información utilizando una memoria de 512 M (2 32 = 4294967296)

2.2.8.2 Comandos comunes

1.Nuevo

  • Valor de desplazamiento de la clave setbit: agrega un elemento al valor de la posición especificada

ilustrar:

imagen-20230620090025609

  • nuevo valor

2. Consulta

Obtener el valor del elemento especificado

  • desplazamiento de clave getbit: obtiene el valor de la posición especificada del elemento especificado

ilustrar:

imagen-20230620090231242

  • Valor de consulta

Obtenga los bytes de almacenamiento del elemento especificado

  • clave strlen: obtiene el número de bytes almacenados en el elemento especificado

ilustrar:

imagen-20230620090417398

  • Consultar espacio ocupado
  • Clave de recuento de bits: obtiene el número de unos en el elemento especificado

ilustrar:

imagen-20230620093424774

  • Consulta el numero de 1

Obtenga el almacenamiento de bits de varios elementos especificados :

  • Tecla de destino de operación BITOP [clave…]: obtiene elementos en varios bits

ilustrar:

imagen-20230620093853725

imagen-20230620093904367

Reponer:

  • BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN, realice una unión lógica en una o más claves y guarde el resultado en destkey.
  • BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN, realice OR lógico en una o más claves y guarde el resultado en destkey.
  • BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN, realice XOR lógico en una o más claves y guarde el resultado en destkey.
  • BITOP NOT destkey srckey, encuentra la negación lógica de la clave dada y guarda el resultado en destkey.

2.2.8.3 Escenarios de aplicación

Cuente el número de registros de usuarios

2.2.9Tipo de registro HyperLog

2.2.9.1 Descripción general

Redis HyperLogLog es un algoritmo para estadísticas de cardinalidad . La ventaja de HyperLogLog es que cuando el número o volumen de elementos de entrada es muy, muy grande, el espacio requerido para calcular la cardinalidad siempre es fijo y pequeño.

​ En Redis, cada clave HyperLogLog solo cuesta 12 KB de memoria para calcular la cardinalidad de casi 2^64 elementos diferentes. Esto contrasta marcadamente con una colección que consume más memoria al calcular la cardinalidad: cuantos más elementos haya, más memoria se consumirá.

2.2.9.2 Comandos comunes

1.Nuevo

  • Elemento clave PFADD (Agregación fija probabilística) [elemento...]: agrega el elemento especificado a HyperLogLog

ilustrar:

imagen-20230620095344735

  • Agregar nuevo elemento

2.Modificar

  • PFMERGE (Fusión fija probabilística) destkey sourcekey [sourcekey...]: fusiona múltiples HyperLogLogs en un HyperLogLog

ilustrar:

imagen-20230620100108902

  • fusionar base

3. Consulta

  • Tecla PFCOUNT [tecla…]: Devuelve la estimación de cardinalidad para el HyperLogLog dado

ilustrar:

imagen-20230620095541770

  • Obtener el número básico después de la deduplicación

2.2.9.3 Escenarios de aplicación

Cuente el UA (número de visitas de usuarios) de sitios web comerciales

2.2.10Tipo de corriente

2.2.10.1 Descripción general

Stream es un nuevo tipo de datos introducido por Redis 5.0, que puede implementar una cola de mensajes muy completa.

2.2.10.2 Comandos comunes

1.Nuevo

  • Valor del campo ID de clave XADD [valor del campo...]: use XADD para agregar mensajes a la cola. Si la cola especificada no existe, cree la cola.

imagen-20230627165330014

ilustrar:

imagen-20230627165408092

  • Ver resultados

imagen-20230627165603791

  • XGROUP [CREAR nombre de grupo clave id-o-$]: Crear grupo de consumidores

imagen-20230627185125034

ilustrar:

imagen-20230627190650580

  • Cree el grupo de consumidores g1 con la clave s1 y conserve los datos
  • XGROUP [CREATECONSUMER clave nombre de grupo nombre de consumidor]: agregue el consumidor especificado en el grupo de consumidores

ilustrar:

imagen-20230627191606210

  • Especifique la clave y el grupo de consumidores y agréguele consumidores
  • Grupo de claves XPENDING [[IDLE min-idle-time] recuento inicial y final [consumidor]]: muestra información sobre los mensajes pendientes

ilustrar:

imagen-20230627193924082

  • Devolver todos los mensajes confirmados

2.Eliminar

  • XGROUP [DESTROY nombre del grupo de claves]: utilice XGROUP DESTROY para eliminar grupos de consumidores

ilustrar:

imagen-20230627192640457

  • Especificar la clave y el nombre del grupo de consumidores
  • XGROUP [DELCONSUMER nombre de grupo de claves nombre de consumidor]: elimina el consumidor especificado en el grupo de consumidores

ilustrar:

imagen-20230627192006807

  • Para ser probado

3. actualizar

  • ID del grupo de claves XACK [ID…]: marcar el mensaje como "procesado"

ilustrar:

imagen-20230627193418877

  • Especifique la clave, el nombre del grupo y el ID de la cola que se procesará.

4.Consulta

  • XREAD [CONTAR recuento] [BLOQUEAR milisegundos] STREAMS clave [clave…] id [id…]: use XREAD para obtener una lista de mensajes de forma bloqueante o sin bloqueo

imagen-20230627165657706

ilustrar:

imagen-20230627165711192

  • elemento de consulta

imagen-20230627165943940

  • Bloquear la lectura de las últimas noticias.

imagen-20230627170016887

  • Consumidor del grupo XREADGROUP GROUP [COUNT count] [BLOCK milisegundos] [NOACK] STREAMS key [key...] ID [ID...]: lee mensajes en el grupo de consumidores

imagen-20230627193002881

ilustrar:

imagen-20230627194109893

imagen-20230627194055941

2.2.11 tipo GEO

2.2.11.1 Descripción general

GEO es la abreviatura de Geolocalización, que representa coordenadas geográficas. Redis agregó soporte para GEO en la versión 3.2, lo que nos permite almacenar información de coordenadas geográficas y nos ayuda a recuperar datos basados ​​en longitud y latitud.

2.2.11.2 Comandos comunes

1.Nuevo

  • Clave GEOADD [NX | XX] [CH] longitud miembro de latitud: agrega información geoespacial , que incluye: longitud (longitud), latitud (latitud), valor (miembro)

ilustrar:

imagen-20230630170417913

  • Explicación del parámetro:GEOADD 键 精度 维度 值

imagen-20230630170525512

  • Clave GEOPOS [miembro [miembro…]]: Devuelve las coordenadas del miembro especificado

ilustrar:

imagen-20230630171355312

  • Explicación del parámetro:GEOPOS 键 成员

2.Modificar

  • GEODIST clave miembro1 miembro2 [M | KM | FT | MI]: Calcula la distancia entre los dos puntos especificados y regresa

ilustrar:

imagen-20230630170623078

  • Explicación del parámetro:GEODIST 键 值1 值2
  • Clave GEOSEARCH <miembro FROMMEMBER | FROMLONLAT longitud latitud> <radio BYRADIUS <M | KM | FT | MI> | BYBOX ancho alto <M | KM | FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD ] [WITHDIST] [WITHHASH]: busque miembros dentro del rango especificado, ordénelos por su distancia desde el punto especificado y devuélvalos. El rango puede ser circular o rectangular. 6.2 Nuevas características

ilustrar:

imagen-20230630171040201

  • Explicación del parámetro:GEODIST 键 指定经纬度 画圆 举例 返回距离
  • Clave GEOHASH [miembro [miembro…]]: convierte las coordenadas del miembro especificado en forma de cadena hash y devuelve

ilustrar:

imagen-20230630171531192

  • Explicación del parámetro:GEOHASH 键 成员

3. Cliente Redis Java

Resumen de notas:

  1. Descripción general: el sitio web oficial de Redis ofrece clientes en varios idiomas, dirección: https://redis.io/clients
  2. Uso básico de Jedis: Jedis en sí no es seguro para subprocesos y la creación y destrucción frecuentes de conexiones provocarán pérdidas de rendimiento.
  3. Grupo de conexiones Jedis: en este momento, se utiliza el grupo de conexiones Jedis en lugar del método de conexión directa Jedis para reducir la creación y destrucción frecuentes de conexiones.
  4. Uso de SpringDataRedis: SpringData es un módulo para operaciones de datos en Spring, incluida la integración de varias bases de datos
  5. Serialización de RedisSerializr: el método de serialización personalizado hace que los recursos de almacenamiento de Redis ahorren más memoria
  6. Uso de StringRedisTemplate: para ahorrar espacio en la memoria, no usamos el serializador JSON para procesar el valor, sino que usamos el serializador String de manera uniforme, lo que requiere que solo se almacenen la clave y el valor del tipo String. Cuando es necesario almacenar objetos Java, la serialización y deserialización de los objetos se realiza manualmente .

3.1 Descripción general

​ Los clientes en varios idiomas se proporcionan en el sitio web oficial de Redis, dirección: https://redis.io/clients

imagen-20230620100924688

ilustrar:

  • Hay muchos usos excelentes del cliente en el cliente Java, se recomienda aprender Jedis y Lettcuce.

    imagen-20230620101013947

  • Spring integra las operaciones Jedis y lechuga del cliente Java, llamado Spring Data Redis, aprenda Spring Data Redis en este momento

3.2 Casos de uso básicos: uso de Jedis

3.2.1 Descripción general

Dirección del sitio web oficial de Jedis: https://github.com/redis/jedis

3.2.2 Casos de uso básicos

Paso 1: importar dependencias

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.4.1</version>
</dependency>

<!--单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

Paso 2: demostración

public class JedisTest {
    
    

    public Jedis jedis;

    @Before
    public void setUp() {
    
    
        // 1.建立连接
        jedis = new Jedis("10.13.164.55", 6379);
        // 2.设置密码
        jedis.auth("qweasdzxc");
        // 3.选择库
        jedis.select(0);
    }

    @Test
    public void testSet() {
    
    
        String set = jedis.set("yueyue2", "玥玥");
        System.out.println(set);
        String s = jedis.get("yueyue2");
        System.out.println(s);
    }

    @After
    public void setDown() {
    
    
        if (Objects.isNull(jedis)) {
    
    
            jedis.close();
        }
    }
}

ilustrar:

Crea objetos Jedis, métodos de prueba y cierra recursos.

3.2.3 Grupo de conexiones Jedis

3.2.3.1 Descripción general

Jedis en sí no es seguro para subprocesos y la creación y destrucción frecuentes de conexiones provocará una pérdida de rendimiento, por lo que le recomendamos que utilice el grupo de conexiones Jedis en lugar del método de conexión directa de Jedis.

3.2.3.2 Casos de uso básicos

Paso 1: crear una fábrica
/**
 * 获取Jedis连接池工厂
 */
public class JedisConnectionFactory {
    
    
    private static final JedisPool jedisPool;

    static {
    
    
        // 配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 最大连接
        jedisPoolConfig.setMaxTotal(8);
        // 最大空闲连接,当有连接时,最多准备8个连接点
        jedisPoolConfig.setMaxIdle(8);
        // 最小空闲连接,当没有连接时,会释放所有连接点
        jedisPoolConfig.setMinIdle(0);
        // 设置最长等待时间,ms
        jedisPoolConfig.setMaxWait(Duration.ofMillis(200));
        // 创建连接此对象
        jedisPool = new JedisPool(jedisPoolConfig, "10.13.164.55", 6379, 2000, "qweasdzxc");
    }

    // 获取Jedis对象
    public static Jedis getJedis() {
    
    
        return jedisPool.getResource();
    }
}
Paso 2: demostración
public class JedisTest {
    
    

    public Jedis jedis;

    @Before
    public void setUp() {
    
    
        // 1.建立连接
        // jedis = new Jedis("10.13.164.55", 6379);
        // 2.设置密码
        // jedis.auth("qweasdzxc");
        jedis = JedisConnectionFactory.getJedis();
        // 3.选择库
        jedis.select(0);
    }

    @Test
    public void testSet() {
    
    
        String set = jedis.set("yueyue2", "玥玥");
        System.out.println(set);
        String s = jedis.get("yueyue2");
        System.out.println(s);
    }

    @After
    public void setDown() {
    
    
        if (Objects.isNull(jedis)) {
    
    
            jedis.close();
        }
    }
}

3.3 Casos de uso básicos: uso de SpringDataRedis

3.3.1 Descripción general

SpringData es un módulo de operación de datos en Spring, que incluye la integración de varias bases de datos, entre las cuales el módulo de integración de Redis se llama SpringDataRedis, dirección del sitio web oficial: https://spring.io/projects/spring-data-redis

  • Proporciona integración de diferentes clientes Redis (Lettuce y Jedis)
  • Proporciona API unificada de RedisTemplate para operar Redis
  • Admite el modelo de publicación-suscripción de Redis
  • Soporta Redis Sentinel y Redis Cluster
  • Admite programación reactiva basada en Lettuce
  • Admite serialización y deserialización de datos basada en JDK, JSON, cadenas y objetos Spring
  • Admite la implementación de JDKCollection basada en Redis

3.3.2 Casos de uso básicos

Descripción: operaciones de comando comunes

API Tipo de valor de retorno ilustrar
redisTemplate.opsForValue () ValorOperaciones Manipular datos de tipo cadena
redisTemplate.opsForHash () Operaciones Hash Manipular datos de tipo Hash
redisTemplate.opsForList () Lista de operaciones Manipular datos de tipo lista
redisTemplate.opsForSet () Establecer operaciones Manipular datos de tipo conjunto
redisTemplate.opsForZSet () OperacionesZSet Operar datos de tipo SortedSet
redisPlantilla comandos comunes

Paso 1: importar dependencias

 <dependencies>
        <!--SpringDataRedis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

ilustrar:

Este experimento opera en SpringBoot, así que importe las dependencias de SpringBoot

Paso 2: agregar configuración

spring:
  redis:
    host: 10.13.164.55
    port: 6379
    password: qweasdzxc
    lettuce: # redis默认使用lettuce客户端进行连接
      pool:
        max-active: 8 # 最大连接
        min-idle: 0 # 最小空闲
        max-idle: 8 # 最大空闲
        max-wait: 200 # 连接等待时间

ilustrar:

Configure el archivo de configuración de Redis para facilitar el ensamblaje automático de SpringBoot

Paso 3: demostración

@SpringBootTest
class SpringDataRedisDemoApplicationTests {
    
    
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
    
    
        redisTemplate.opsForValue().set("yueyue", "玥玥大美女");
        Object o = redisTemplate.opsForValue().get("yueyue");
        System.out.println(o.toString());
    }
}

ilustrar:

Es necesario utilizar @Autowiredanotaciones para implementar la inyección de dependencia.

Aviso:

  • RedisTemplate puede recibir cualquier objeto como valor y escribirlo en Redis, pero serializará el objeto en forma de bytes antes de escribirlo. El valor predeterminado es utilizar la serialización JDK. El resultado es el siguiente

    imagen-20230620124625595

  • Hacerlo empeorará la legibilidad y consumirá mucha memoria.

  • Al observar el código fuente, descubrí que la capa subyacente usa el objeto ObjectOutputStream para convertir objetos Java en bytes.

    imagen-20230620125025159

3.3.3 Serialización de RedisSerializr

3.3.3.1 Descripción general

Debido a que el método de serialización de SpringDataRedis adopta la serialización JDK predeterminada y no puede implementar la forma en que almacenamos datos para obtener lo que vemos y obtenemos, aquí usamos la serialización personalizada.

imagen-20230620130143399

ilustrar:

Hay muchas formas de implementar la serialización personalizada. El método de serialización de SpringDataRedis utiliza JdkSerializationRedisSerializerla serialización de forma predeterminada. Aquí se recomiendan dos métodos de serialización, uno es el método de serialización para convertir cadenas en cadenas StringRedisSerializery el otro es la conversión entre Json y cadenas.GenericJackson2JsonRedisSerializer

3.3.3.2 Casos de uso básicos

Paso 1: serialización personalizada
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
        throws UnknownHostException {
    
    
    // 创建Template
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    // 设置连接工厂
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    // 设置序列化工具
    GenericJackson2JsonRedisSerializer jsonRedisSerializer = 
					new GenericJackson2JsonRedisSerializer();
    // key和 hashKey采用 string序列化
    redisTemplate.setKeySerializer(RedisSerializer.string()); 
    redisTemplate.setHashKeySerializer(RedisSerializer.string());
    // value和 hashValue采用 JSON序列化
    redisTemplate.setValueSerializer(jsonRedisSerializer);
    redisTemplate.setHashValueSerializer(jsonRedisSerializer);
    return redisTemplate;
}

ilustrar:

  • En este punto, complete la inyección de dependencia de RedisTemplate y reescriba su propia lógica.
  • Fábrica de conexiones, el marco SpringBoot completará automáticamente la inyección por nosotros, por lo que la fábrica de conexiones se utiliza directamente aquí.
Paso 2: demostración
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
    
    
    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    @Test
    void testString() {
    
    

        redisTemplate.opsForValue().set("yueyue", "玥玥,大美女");
        Object o = redisTemplate.opsForValue().get("yueyue");
        System.out.println(o.toString());

    }

    @Test
    void testObject() {
    
    

        redisTemplate.opsForValue().set("yueyue", new User("玥玥", 17, "大美女"));
        Object o = redisTemplate.opsForValue().get("yueyue");
        System.out.println(o.toString());
    }
}

ilustrar:

  • Los resultados del método testString son los siguientes

imagen-20230620143616497

  • Los resultados del método testObject son los siguientes

imagen-20230620171002485

Aviso:

Cada vez que se almacena el valor de un objeto, para realizar la serialización y deserialización automática, SpringDataRedis agregará una cadena larga de nombres de clase de ruta completos, por lo que ocupará mucho espacio en la memoria.

3.3.4Uso de StringRedisTemplate

3.3.4.1 Descripción general

Para ahorrar espacio en la memoria, no usamos el serializador JSON para procesar el valor, sino que usamos el serializador String de manera uniforme, lo que requiere que solo se almacenen la clave y el valor del tipo String. Cuando es necesario almacenar objetos Java, la serialización y deserialización de los objetos se realiza manualmente .

imagen-20230620144911783

ilustrar:

Completar manualmente la serialización y deserialización de objetos es problemático, pero puede ahorrar espacio en la memoria.

3.3.4.2 Casos de uso básicos

Paso 1: importar dependencias
<!--SpringDataRedis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!--jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.33</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
Paso 2: demostración
@SpringBootTest
class SpringDataRedisDemoApplicationTests2 {
    
    
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Test
    void testString() {
    
    

        stringRedisTemplate.opsForValue().set("yueyue", "玥玥,大美女");
        Object o = stringRedisTemplate.opsForValue().get("yueyue");
        System.out.println(o.toString());

    }

    @Test
    void testObject() {
    
    

        User user = new User("玥玥", 17, "大美女");
        String jsonString = JSON.toJSONString(user);  // 此处使用fastJson工具进行对象的序列化与反序列化
        stringRedisTemplate.opsForValue().set("yueyue", jsonString);
        String result = stringRedisTemplate.opsForValue().get("yueyue");
        User resultUser = JSON.parseObject(result, User.class);
        System.out.println(resultUser);
    }
}

ilustrar:

  • Los resultados del método testString son los siguientes

    imagen-20230620145636869

  • Los resultados del método testObject son los siguientes

    imagen-20230620145810654

Supongo que te gusta

Origin blog.csdn.net/D_boj/article/details/131713371
Recomendado
Clasificación