I. Escenarios de uso de las estructuras de datos de Redis
Anteriormente había leído el libro redisbook, y ya estoy familiarizado con las funciones básicas de Redis. Desde la semana pasada he estado leyendo el código fuente de Redis. El objetivo actual es dominar por completo las estructuras de datos de Redis. Todos sabemos que en Redis hay 5 tipos de estructuras de datos. Entonces, ¿cuáles son los escenarios de uso de cada una?
- String — cadena
- Hash — diccionario
- List — lista
- Set — conjunto
- Sorted Set — conjunto ordenado
A continuación, explicaremos brevemente sus respectivos escenarios de uso:
1. String — cadena
La estructura de datos String es un tipo simple de clave-valor (key-value). El value no solo puede ser un String, sino también un número (cuando el tipo numérico se puede representar con Long, el encoding es de tipo entero; en otros casos se almacena en sdshdr como cadena). Usando el tipo Strings, se pueden implementar completamente las funciones actuales de Memcached, y con mayor eficiencia. También se puede disfrutar de la persistencia programada de Redis (se puede elegir el modo RDB o el modo AOF), el registro de operaciones y funciones como Replication. Además de proporcionar operaciones como get, set, incr, decr, igual que Memcached, Redis también ofrece las siguientes operaciones:
LEN niushuai: Obtener la longitud de la cadena en O(1)APPEND niushuai redis: Añadir (append) contenido a la cadena, con asignación inteligente de memoria (el doble de la capacidad en cada ocasión)- Establecer y obtener un segmento del contenido de la cadena
- Establecer y obtener un bit (bit) de la cadena
- Establecer en lote el contenido de una serie de cadenas
- Contador atómico
- El truco del comando GETSET: puedes establecer un nuevo valor a la vez que se vacía el valor anterior, y usarlo junto con el contador atómico
2. Hash — diccionario
En Memcached, a menudo empaquetamos información estructurada en un hashmap, la serializamos en el cliente y la almacenamos como un valor de tipo cadena (generalmente en formato JSON), como el apodo, la edad, el sexo, los puntos del usuario, etc. En ese momento, si se necesita modificar uno de los elementos, normalmente es necesario sacar la cadena (JSON), deserializarla, modificar el valor de un elemento y volver a serializarla en una cadena (JSON) para almacenarla. Modificar un simple atributo hace que se tengan que hacer tantas cosas; el consumo debe ser muy grande, y no es adecuado para escenarios donde puedan ocurrir operaciones concurrentes (por ejemplo, dos operaciones concurrentes que necesiten modificar los puntos). En cambio, la estructura Hash de Redis te permite modificar solo el valor de un atributo, como si estuvieras haciendo un UPDATE de un atributo en una base de datos.
- Almacenar, leer y modificar atributos de usuario
3. List — lista
List, en pocas palabras, es una lista enlazada (Redis implementa List mediante una lista doblemente enlazada). Quienes hayan aprendido estructuras de datos deberían entender su estructura. Con la estructura List, podemos implementar fácilmente funciones como la clasificación de las últimas noticias (por ejemplo, el TimeLine de Sina Weibo). Otra aplicación de List es la cola de mensajes: se pueden usar las operaciones *PUSH de List para almacenar tareas en la lista, y luego los hilos de trabajo usan la operación POP para extraer las tareas y ejecutarlas. Redis también proporciona una API para operar con un segmento de elementos de la List, permitiendo consultar o eliminar directamente elementos de un segmento de la List.
- TimeLine de Weibo
- Cola de mensajes
4. Set — conjunto
Set es un conjunto; el concepto de conjunto es una combinación de valores no repetidos. Con la estructura de datos Set proporcionada por Redis, se pueden almacenar datos de tipo conjunto. Por ejemplo, en una aplicación de microblogging (Weibo), se pueden guardar todos los usuarios que una persona sigue en un conjunto y todos sus seguidores en otro conjunto. Debido a que Redis, de manera muy conveniente, ofrece operaciones como intersección, unión y diferencia para los conjuntos, se pueden implementar fácilmente funciones como intereses comunes, gustos comunes, amigos en segundo grado, etc. Para todas las operaciones de conjunto anteriores, también puedes usar diferentes comandos para elegir devolver el resultado al cliente o guardarlo en un nuevo conjunto.
- Amigos en común, amigos en segundo grado
- Aprovechando la unicidad, se pueden contar todas las IP independientes que visitan el sitio web
- Para la recomendación de amigos, se calcula la intersección según las etiquetas (tags), y si es mayor que cierto umbral (threshold), se puede recomendar
5. Sorted Set — conjunto ordenado
En comparación con los Sets, los Sorted Sets añaden un parámetro de peso (score) a los elementos del Set, permitiendo que los elementos del conjunto se ordenen según el score. Por ejemplo, en un Sorted Set que almacena las calificaciones de todos los compañeros de clase, el value del conjunto puede ser el número de estudiante y el score puede ser su puntuación en el examen. De esta manera, al insertar los datos en el conjunto, ya se ha realizado una ordenación natural. Además, se pueden usar los Sorted Sets para crear colas con peso: por ejemplo, los mensajes normales tienen score 1, los mensajes importantes tienen score 2, y luego los hilos de trabajo pueden elegir obtener las tareas en orden descendente de score, permitiendo que las tareas importantes se ejecuten primero.
- Elementos con peso, por ejemplo, una tabla de clasificación de puntuaciones de usuarios de un juego
- Es una estructura de datos relativamente compleja; en general, no se usa en demasiados escenarios
II. Escenarios de uso de otras funciones de Redis
1. Sistema de suscripción-publicación
Pub/Sub, literalmente, significa publicar (Publish) y suscribirse (Subscribe). En Redis, puedes configurar la publicación y suscripción de mensajes para un valor de clave (key). Cuando se publica un mensaje en un valor de clave, todos los clientes que lo hayan suscrito recibirán el mensaje correspondiente. El uso más evidente de esta función es como sistema de mensajería en tiempo real, como la mensajería instantánea común, el chat grupal y otras funciones.
2. Transacciones
¿Quién dijo que NoSQL no soporta transacciones? Aunque las Transactions de Redis no son transacciones estrictamente ACID (por ejemplo, en una serie de comandos enviados con EXEC, si el servidor se cae durante la ejecución, algunos comandos se ejecutarán y otros no), estas Transactions aún proporcionan la función básica de ejecutar comandos empaquetados (siempre que el servidor no tenga problemas, se puede garantizar que una serie de comandos se ejecute en orden y de forma conjunta, sin que otros comandos de clientes se intercalen en el medio). Redis también ofrece una función Watch: puedes hacer Watch sobre una key y luego ejecutar Transactions. Durante este proceso, si el valor vigilado (Watched) ha sido modificado, la Transactions lo detectará y se negará a ejecutarse.