O princípio e o uso do bitmap no Redis

princípio

Primeiro declare: o Redis tem 5 tipos de dados e o BitMap não é um novo tipo de dados no Redis, e a camada inferior é a implementação do Redis.

Normalmente, armazenamos uma string em redis, como: "big", seu bitmap é o seguinte:

0,001kb = 1b = 8bit

Portanto, a string "big" ocupa 3 caracteres, ou seja, 24 bits.

O Redis adicionou vários comandos relacionados a bitmap, como setbit, getbit e bitcount desde a versão 2.2.0. Embora seja um comando novo, ele não adiciona novos tipos de dados, pois comandos como setbit são apenas extensões a serem definidas.

Usando os comandos acima, o Redis pode manipular bits binários, e pode pegar/alterar o valor correspondente a cada bit, basta escrever alguns:

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 partir do exemplo acima, podemos encontrar:

  • getbit, setbit pode realizar operações de bit em strings e pode obter/modificar o valor de um bit;
  • Depois que o bit da string é modificado, a própria string também mudou fundamentalmente, big -> cig.

O significado original de BitMap é usar um bit para definir 0 ou 1 para mapear o estado de um elemento.

Como um bit só pode representar dois estados de 0 e 1, ou seja, a quantidade máxima de informação que um bit pode armazenar é 2, então o BitMap pode mapear um estado limitado, mas a vantagem de usar bits é que ele pode economizar um muito espaço de memória.


 Comandos relacionados ao BitMap

No Redis, Bitmap é uma série de números binários consecutivos (0 ou 1). Portanto, Bitmaps podem ser imaginados como uma matriz de bits, e a posição de cada bit da matriz é deslocada (offset) , o subscrito da matriz é chamado offset em Bitmaps, e AND, OR, XOR e outras operações de bit podem ser executadas no bitmap.

# 设置值,其中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]

Computação Espacial BitMap

Como os bits no BitMap são o mapeamento de strings e o armazenamento de strings em valor é limitado, o espaço de armazenamento de valor do BitMap pode ser calculado da mesma maneira.

O comprimento máximo de uma string no Redis é 512M, portanto, o deslocamento máximo (deslocamento) do BitMap é:

512 * 1024 * 1024 * 8  =  2^32

cenas a serem usadas

1. Login do usuário

Muitos sites fornecem uma função de check-in e precisam exibir a situação de check-in do último mês, o que pode ser obtido usando o BitMap.
De acordo com deslocamento de data = (dia do ano hoje) % (dia do ano), chave = ano: id do usuário.

Se você precisar armazenar as informações detalhadas de check-in do usuário, considere usar um encadeamento de uma etapa para concluí-lo.

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

2. Estatísticas de usuários ativos (status de login do usuário)

Use a data como a chave, então o ID do usuário é deslocado, definido como 1 se estiver ativo naquele dia. Os critérios específicos de como ser ativo podem ser especificados por você mesmo.

E se:

  • 20220101 Os usuários ativos são: [1, 0, 1, 1, 0]
  • 20220102 Os usuários ativos são: [ 1, 1, 0, 1, 0 ]

Conte o número total de usuários ativos por dois dias consecutivos:

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

Estatísticas do número total de usuários ativos de 20220101 a 20220102:

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

3. Status on-line do usuário estatístico

Se você precisar fornecer uma interface para consultar se o usuário atual está online, você também pode considerar usar o BitMap, que economiza espaço e é altamente eficiente. Apenas uma chave é necessária e, em seguida, o ID do usuário é deslocado, que é definido como 1 se estiver online e 0 se não estiver online.

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

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

4. Implemente o filtro Bloom

Os filtros Bloom abordam a penetração de cache.


Resumir

  1. O Bigmap é armazenado com base no menor bit unitário, e a maior vantagem é que ele economiza muito espaço;
  2. A complexidade de tempo é O(1) ao configurar e O(n) ao ler, e a operação é muito rápida;
  3. O armazenamento de dados binários é muito rápido ao realizar cálculos relacionados e também pode ser facilmente expandido;
  4. Não defina um bigmap muito curto com um valor de deslocamento muito longo, pois isso pode bloquear.

Acho que você gosta

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