[Redis] El principio y el uso del mapa de bits en Redis

1. Principio

Primera declaración: Redis tiene 5 tipos de datos, y BitMap no es un nuevo tipo de datos en Redis, su capa inferior es la implementación de Redis.

Por lo general, almacenamos una cadena en redis, como: "grande", y su mapa de bits es el siguiente:
inserte la descripción de la imagen aquí

0.001kb = 1b = 8 bits

Por lo tanto, la cadena "grande" ocupa 3 caracteres, que son 24 bits.

Redis ha agregado varios comandos relacionados con mapas de bits, como setbit, getbit y bitcount desde la versión 2.2.0. Aunque es un comando nuevo, no se agrega ningún tipo de datos nuevo, porque los comandos como setbit son solo extensiones en set.

Usando los comandos anteriores, Redis puede manipular bits binarios y puede obtener/cambiar el valor correspondiente a cada bit, simplemente escriba algunos:

127.0.0.1:6379 > set hello big
"OK"
 
127.0.0.1:6379 > getbit hello 0
"0"
 
127.0.0.1:6379 > getbit hello 1
"1"
 
127.0.0.1:6379 > setbit hello 7 1
"0"
 
127.0.0.1:6379 > get hello
"cig"

A través del ejemplo anterior, podemos encontrar que:

  • getbit, setbit puede realizar operaciones de bits en cadenas y puede obtener/modificar el valor de un determinado bit;
  • Después de modificar los bits de la cadena, la propia cadena cambia fundamentalmente, grande -> cig.

El significado original de BitMap es usar un bit para establecer 0 o 1 para mapear el estado de un elemento.

Dado que un bit solo puede representar dos estados de 0 y 1, es decir, la cantidad máxima de información que puede almacenar un bit es 2, por lo que los estados que puede mapear BitMap son limitados, pero la ventaja de usar bits es que puede ahorrar mucho espacio de memoria.

2. Comandos relacionados con mapas de bits

En Redis, el mapa de bits es una serie de números binarios continuos (0 o 1), por lo que los mapas de bits se pueden imaginar como una matriz en bits, y la posición de cada bit de la matriz se compensa (offset), el subíndice de la matriz se llama el desplazamiento en mapas de bits, y AND, OR, XOR y otras operaciones de bits se pueden realizar en el mapa de bits.

# 设置值,其中value只能是 0 和 1
setbit key offset value
 
# 获取值
getbit key offset
 
# 获取指定范围内值为 1 的个数
# start 和 end 以字节为单位
bitcount key start end
 
# BitMap间的运算
# operations 位移操作符,枚举值
  AND 与运算 &
  OR 或运算 |
  XOR 异或 ^
  NOT 取反 ~
# result 计算的结果,会存储在该key中
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。
bitop [operations] [result] [key1] [keyn…]
 
# 返回指定key中第一次出现指定value(0/1)的位置
bitpos [key] [value]

3. Cálculo del espacio de mapa de bits

Debido a que el bit en BitMap es una asignación de cadenas, el almacenamiento de cadenas en valor tiene un límite superior, por lo que el espacio de almacenamiento de valor de BitMap se puede calcular de la misma manera.

La longitud máxima de una cadena en Redis es 512M, por lo que el desplazamiento máximo (offset) de BitMap es:

512 * 1024 * 1024 * 8  =  2^32

4. Escenarios de uso

1. Inicio de sesión de usuario

Muchos sitios web ofrecen una función de registro y necesitan mostrar el estado de registro del último mes, lo que se puede lograr mediante BitMap.
Según fecha offset = (día del año actual) % (día del año), clave = año: id de usuario.

Si necesita almacenar la información de registro detallada del usuario en la base de datos, puede considerar usar un hilo de un solo paso para completarlo.

# 2021年第一天,用户Id = userId 的用户签到
setbit 2021:userId 1 1

2. Estadísticas de usuarios activos (estado de inicio de sesión del usuario)

Use la fecha como clave, luego la identificación del usuario como compensación, establezca en 1 si está activo ese día. Puede especificar el estándar de cómo estar activo.

si:

  • 20220101 Los usuarios activos son: [1, 0, 1, 1, 0]
  • 20220102 Los usuarios activos son: [ 1, 1, 0, 1, 0 ]

Cuente el número total de usuarios activos durante dos días consecutivos:

bitop and dest1 20220101 20220102 
# dest1 中值为1的offset,就是连续两天活跃用户的ID
bitcount dest1

Cuente el número total de usuarios activos desde 20220101 hasta 20220102:

bitop or dest2 20220101 20220102
# dest2 中值为1的offset,就是两天都活跃的用户的ID
bitcount dest2

3. Estadísticas del estado en línea del usuario

Si necesita proporcionar una interfaz para consultar si el usuario actual está en línea, también puede considerar usar BitMap, que ahorra espacio y es muy eficiente. Solo se necesita una clave y la identificación del usuario se compensa. Si está en línea, se establece en 1, y si no está en línea, se establece en 0.

# userId 登录,设置状态为1
setbit key userId 1
 
# 获取 userId 的状态:1 - 在线;0 - 不在线
getbit key userId

4. Implementar el filtro Bloom

Los filtros Bloom resuelven la penetración de caché.

Para obtener más información sobre los filtros Bloom, consulte mi artículo: Filtro Bloom

V. Resumen

  1. Bigmap se almacena en base al bit de unidad más pequeño, y la mayor ventaja es que ahorra espacio;
  2. La complejidad de tiempo de ajuste es O(1) y la complejidad de tiempo de lectura es O(n) La operación es muy rápida;
  3. El almacenamiento de datos binarios es muy rápido al realizar cálculos relacionados, y también se puede ampliar fácilmente;
  4. No establezca un valor de desplazamiento muy largo para un mapa grande muy corto, ya que esto puede causar un bloqueo.

Supongo que te gusta

Origin blog.csdn.net/u011397981/article/details/130693847
Recomendado
Clasificación