Cuando se usa redis para registrar ID de usuario, ¿es mejor usar mapeo o hash?
Tipos de datos comunes en redis
Los cinco tipos de datos más comunes en redis son:
Cadena
Hash
Lista
Conjunto
Colección ordenada
Antes de describir estos tipos de datos, debemos mirar una imagen. Echemos un vistazo a una imagen para comprender cómo se describen estos diferentes tipos de datos en la administración de memoria interna de redis:
En primer lugar, redis utiliza objetos redisobject internamente para representar todas las claves y valores. Acerca de redisobject Lo más importante. La información se muestra en la figura anterior: el tipo representa
el valor
el tipo de datos específico del objeto y el tipo de datos del objeto. La codificación es la forma en que se almacenan los diferentes tipos de datos en redis. Por ejemplo: tipo = cadena significa que el valor se almacena como una cadena normal, por lo que la codificación correspondiente puede ser raw o int. Si es int, significa que redis en realidad almacena y representa el valor de acuerdo con el tipo numérico de la cadena. Una cadena, si la cadena misma se puede representar como un valor numérico, como "123"
"456".
El campo vm debe especificarse aquí. Asignará memoria solo cuando la función de memoria virtual de Redis esté activada.
A través de
podemos ver que redis usa redisobject para representar todos los datos clave/valor, lo cual es una pérdida de memoria. Por supuesto, estos costos de administración de memoria también son para proporcionar una interfaz de administración unificada para diferentes tipos de datos en redis para ahorrar uso de memoria, lo cual discutiremos más adelante.
Primero analizaremos el uso y la implementación interna de los siguientes cinco tipos de datos:
String
Comandos comunes:
set, obtener, decr, incr, mget, etc.
Escenarios de aplicación:
La cadena es uno de los tipos de datos más utilizados, y el almacenamiento de clave/valor ordinario también se puede clasificar en esta categoría, por lo que no los explicaré uno por uno. uno aquí.
Método de implementación:
La cadena en el almacenamiento interno de Redis es por defecto una cadena y redisobject hace referencia a ella. Cuando se encuentren incr, decr y otras operaciones, se convertirá en un valor numérico. para el cálculo En este momento, redisobject El campo de codificación es int.
Escenario de aplicación:
Tomemos un ejemplo simple para describir la aplicación de hash. Por ejemplo, queremos almacenar los datos de un objeto de información del usuario, incluida la siguiente información:
Utilice la ID de usuario como valor clave para encontrar el nombre, la edad, la fecha de nacimiento y otra información contenida en el objeto de usuario. Si se utiliza una estructura de clave/valor común para almacenarlo, hay dos principales. Métodos de almacenamiento:
Primero La primera forma es utilizar la identificación del usuario encontrado como clave, encapsular otra información en un objeto y almacenarla de forma serializada. La desventaja de este método es que aumenta la cantidad. sobrecarga de serialización/deserialización, y cuando es necesario modificar uno de ellos, es necesario recuperar todo el objeto cuando se recupera la información, y las operaciones de modificación requieren protección de concurrencia, lo que introduce complicaciones como cas.
El segundo método consiste en almacenar tantos pares clave-valor como miembros haya en el objeto de información del usuario y utilizar el nombre del atributo correspondiente de la identificación del usuario como identificador único para obtener el valor de el atributo correspondiente Aunque se eliminan los problemas de sobrecarga de serialización y concurrencia, pero si hay una gran cantidad de ID de usuario, el desperdicio de memoria sigue siendo muy considerable.
Por lo tanto, el hash proporcionado por redis puede resolver muy bien este problema. El hash de Redis en realidad almacena el valor como un mapa hash internamente y proporciona una interfaz para acceder directamente a los miembros en este mapa, como se muestra a continuación:
En otras palabras, la clave sigue siendo la ID del usuario,
p>valor es un mapa y la clave de este mapa es la identificación del usuario. Los datos de atributos no requieren el almacenamiento repetido de datos ni causan problemas con la serialización y el control de modificaciones concurrentes. Esta es una gran solución al problema.
También debe tenerse en cuenta aquí que la interfaz (hgetall) proporcionada por redis puede obtener directamente todos los datos de atributos, pero si hay una gran cantidad de miembros en el mapa interno, implica atravesar todo el mapa interno.
operación, debido al modo de subproceso único de redis, esta operación transversal puede llevar mucho tiempo y otras solicitudes de los clientes requieren atención especial en este punto.
Implementación:
Redis interno
El valor correspondiente al hash es en realidad un hashmap. En realidad, hay dos formas diferentes de implementar este hash, la que tiene. menos miembros Para ahorrar memoria, el hash se comprimirá y almacenará de forma similar a una matriz unidimensional en lugar de utilizar una estructura de mapa de hash real. El valor correspondiente
redisobject se codifica como un mapa zip y se codificará. se convertirá automáticamente a un mapa de hash real cuando aumente el número de miembros del mapa de hash. La codificación en este momento es ht.HTML.
Lista
Comandos más utilizados:
lpush, rpush, lpush rpush, lpop, rpop, lrange, etc.
Escenarios de aplicación:
redis
list tiene muchos escenarios de aplicación y también es una de las estructuras de datos más importantes de redis, como la lista de seguidores de Twitter, los seguidores. Las listas, etc. se pueden implementar utilizando la estructura de listas de Redis, que es más fácil de entender y no se describirá en detalle aquí.
Implementación:
redis
La lista se implementa en forma de una lista doblemente vinculada, que puede admitir búsqueda inversa y recorrido, es más conveniente de operar. , pero hay una sobrecarga de memoria adicional, muchas cosas implementadas internamente por redis, incluidas las colas de búfer de envío, etc., también utilizan esta estructura de datos.
set
Comandos de uso común:
sadd, spop, smembers, sunion, etc.
Escenarios de aplicación:
redis
Las funciones externas de set son similares a las funciones de list. Lo especial es que set puede volver a ponderarse automáticamente cuando sea necesario. para almacenar una Cuando tiene una lista de datos y no desea almacenar datos repetidamente, set es una buena opción, y set proporciona una interfaz importante para determinar si un miembro está en un conjunto, que lista no tiene.
Implementación:
La implementación interna de set es un
mapa hash cuyo valor siempre está vacío, que en realidad calcula el hash para reponderar rápidamente el valor Hash, lo que Es por eso que set proporciona la función de determinar si un miembro está en el conjunto.
Ordenar colecciones
Comandos comunes:
zadd, zrange, zrem, zcard, etc.
Escenarios de uso:
Los escenarios de uso de las colecciones ordenadas de Redis son similares a los conjuntos. La diferencia es que los conjuntos no se ordenarán automáticamente, mientras que los conjuntos se clasifican
. El usuario puede pasar un parámetro de prioridad de miembro adicional (puntuación) para la clasificación, y la clasificación por inserción se realiza automáticamente.
Cuando necesite una lista ordenada de conjuntos que no se repita, elija una estructura de datos de conjunto ordenado, como la pública de Twitter
.