Introducción al mapa de bits de Redis y su aplicación en escenarios de registro

Este artículo ha participado en el evento "Ceremonia de creación de recién llegados" para comenzar juntos el camino de la creación de oro.

Fundamental:

La descripción de la implementación de mapas de bits en "Diseño e implementación de Redis" es: Redis usa objetos de cadena para representar matrices de bits, porque la estructura de datos SDS utilizada por los objetos de cadena es binariamente segura, por lo que los programas pueden usar estructuras SDS directamente para almacenar matrices de bits, y use las funciones de manipulación de la estructura SDS para procesarla como una matriz.

Entonces, el mapa de bits es esencialmente el tipo de cadena SDS (cadena dinámica simple) de redis.

capa inferior del mapa grande.png

El almacenamiento de la computadora es todos los datos almacenados en 0 y 1 binarios, y el mapa de bits lee, asigna y realiza otras operaciones directamente a los bits de los datos.

Instrucciones relacionadas con mapas de bits de Redis

comando setbit

指令: SETBIT key offset value
复杂度: O(1)
含义:设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。offset位负数或者浮点数,执行报错。(set the original bit value stored at offset)
getbit命令
复制代码

getbitCommand

指令: getbit key offset
复杂度: O(1)
含义:获取key的value(字符串)在offset处的bit值(只能只0或者1)。(get the bit value stored at offset.)
复制代码

comando de conteo de bits

指令: bitcount key
复杂度: O(N)
含义:获取key的value(字符串)所有比特位设置位1的总个数(The number of bits set to 1)。
复制代码

comando de campo de bits

指令: bitfield key [option1] [option2] ....
复杂度: O(1) * 每个指定的子命令
含义: 操作多字节位域,它会执行一系列操作,并返回一个响应数组,在参数列表中每个响应数组匹配相应的操作。
官方文档: http://www.redis.cn/commands/bitfield.html
复制代码

comando de posición de bits

指令: bitpos key 0|1
复杂度: O(N)
含义: 命令返回字符串里面第一个被设置为1或者0的bit位。(后面还可以接start end两个参数,但是偏移量的单位是字节,不是比特位,几乎没用)
复制代码

comando bitop

指令:BITOP [AND|OR|NOT|XOR ]destkey key1 key2
复杂度: O(N)
含义: 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
官方文档: http://www.redis.cn/commands/bitop.html
复制代码

La ocupación de espacio y la ocupación de espacio de tiempo requerida para la primera asignación de espacio aumenta con el aumento del desplazamiento. En la versión redis4.0, puede usar el uso de memoria [clave] para verificar la ocupación de espacio de la clave.

Espacio ocupado.png

La compensación de datos del documento oficial es 2^32-1 (512 MB asignados) requiere ~300 ms la compensación es
2^30-1 (asignada 128 MB) requiere ~80 ms la
compensación es 2^28-1 (asignada 32 MB) requiere ~30 ms la
compensación es 2^26 -1 (8 MB asignados) tarda 8 ms

La fórmula de cálculo de ocupación de espacio aproximada es: ($offset/8/1024/1024)MB

Escenarios de aplicación

El check-in es un escenario típico de uso de mapas de bits Introducción a la
aplicación de comandos
getbit Ver estado de check-in
setbit Mark check -in bitcount
Tiempos de check-in acumulados bitfield Consulta por
lotes marca de check-in

La siguiente es una demostración del escenario de la aplicación de inicio de sesión. Si hay alguna lógica para la recopilación de recompensas del usuario después del inicio de sesión, por supuesto, los comportamientos del usuario, como el registro, también pueden estar involucrados, entonces se pueden usar dos bits para implementar la lógica.

Escenarios de aplicación de facturación acumulativa

Facturación acumulativa.gif

Inicio de sesión acumulado 02.gif

Escenarios de aplicación de registro continuo

Registro continuo.gif

Registro continuo 02.gif

Escena de registro de fecha

fecha iniciar sesión.gif

fecha iniciar sesión 02.gif

Detalles de la aplicación

getbit para ver el valor del bit n----"Bit n" identifica la captura de
pantalla del ejemplo del comando "estado de registro del primer día":

01.png
Significado: compruebe el valor de la clave como Test4SignMzy, el primer bit es 0

Necesitará usar:

La clave se puede utilizar como un período determinado de la actividad de registro, y el "bit N" identifica el "estado de registro del primer día".

setbit marca el bit n como 0 o 1----el usuario "se registra el día n" y marca el "bit n" como 1. Captura de pantalla de ejemplo de comando:

02.png

sentido:

将key为 Test4SignMzy 的value值,第一位比特位赋值为1,然后查看到比特位以改变为1。
复制代码

Necesitará usar:

La clave se puede usar como un período determinado de la actividad de registro. Cuando el usuario "registra el día n", el "bit n" del valor correspondiente a la clave redis se marca como 1.

bitcount cuenta el número de 1 en todos los bits----los usuarios "registran N veces de forma acumulativa" utilizan este valor para consultar la captura de pantalla de ejemplo de comando:

03.png
sentido:

key为 Test4SignMzy 的value值,所占用的所有比特位中,比特位值为1的总数是4个。
复制代码

Aplicación requerida: la clave se puede usar como un período determinado de la actividad de registro, y el usuario puede usar el número total de bits en el valor del valor para que sea 1 para saber si el usuario ha "acumulado N veces de registro ".

El comando bitfield puede operar en múltiples rangos de bits simultáneamente en una sola llamada. Ejemplo de captura de pantalla de las instrucciones:

04.pngsentido:

第一个执行“bitfield Test4SignMzy get u1 1 get u1 2 get u1 3 get u1 4 get u1 8 get u1 9 get u1 10 get u1 99”,意思就是查看Test4SignMzy对应的value的第1、2、3、4、8、9、10、99比特位的值,得到的值当作无符号1位整数返回。加入原本不存在第99位,返回0代替。 

第二个执行“bitfield Test4SignMzy get u1 #1 get u1 #2 get u1 #3 get u1 #4 get u1 #8 get u1 #9 get u1 #10 get u1 #99”,意思和第一个执行含义一样,只不过“get u1 N”中第三个参数“N”表示从这个key的value值的第0位开始,往后偏移N位比特位;而“get u1 #N”中第三个参数“#N”表示从这个key的value值的第0位开始,往后偏移“N乘1(第二个参数表示的长度)”位比特位。 
复制代码

Necesitará usar:

Puede verificar el estado de registro de un usuario durante varios días consecutivos, o todos los días en un ciclo, a partir del cual puede obtener la cantidad de días consecutivos que el usuario ha registrado de forma consecutiva y la cantidad máxima de registros consecutivos. días en el ciclo.

Supongo que te gusta

Origin juejin.im/post/7079605753094340616
Recomendado
Clasificación