El principio y el uso del mapa de bits en Redis

principio

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

Por lo general, almacenamos una cadena en redis, como: "grande", su mapa de bits es el siguiente:

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 agrega nuevos tipos de datos, porque los comandos como setbit son solo extensiones para establecer.

Usando los comandos anteriores, Redis puede manipular bits binarios y puede tomar/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"

Del ejemplo anterior, podemos encontrar:

  • getbit, setbit puede realizar operaciones de bits en cadenas y puede obtener/modificar el valor de un bit;
  • Después de que se modifica el bit de la cadena, la cadena en sí también ha cambiado 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 un bit puede almacenar es 2, por lo que BitMap puede mapear un estado limitado, pero la ventaja de usar bits es que puede guardar un mucho espacio de memoria.


 Comandos relacionados con mapas de bits

En Redis, el mapa de bits es una serie de números binarios consecutivos (0 o 1). Por lo tanto, los mapas de bits se pueden imaginar como una matriz de bits, y la posición de cada bit de la matriz se compensa (offset), el subíndice de la matriz es llamado 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]

Cómputo espacial de mapa de bits

Debido a que los bits en BitMap son el mapeo de cadenas y el almacenamiento de cadenas en valor es limitado, 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

Escenas a utilizar

1. Inicio de sesión de usuario

Muchos sitios web ofrecen una función de registro y necesitan mostrar la situación de registro del último mes, lo que se puede lograr mediante el uso de 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, 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 se compensa, se establece en 1 si estaba activo ese día. Usted mismo puede especificar los criterios específicos sobre 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

Estadísticas del 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 luego se compensa la identificación del usuario, que se establece en 1. si está en línea, y 0 si no está en línea.

# userId 登录,设置状态为1
setbit key userId 1

# 获取 userId 的状态:1 - 在线;0 - 不在线
getbit key userId

4. Implementar el filtro Bloom

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


Resumir

  1. Bigmap se almacena en función del bit de unidad más pequeño, y la mayor ventaja es que ahorra mucho espacio;
  2. La complejidad del tiempo es O(1) cuando se configura y O(n) cuando se lee, y la operación es muy rápida;
  3. El almacenamiento de datos binarios es muy rápido a la hora de realizar cálculos relacionados, y además se puede ampliar fácilmente;
  4. No establezca un mapa grande muy corto con un valor de desplazamiento muy largo, ya que esto puede bloquear.

Supongo que te gusta

Origin blog.csdn.net/weixin_44259720/article/details/122364337
Recomendado
Clasificación