Redis系列第四篇之Bitmap

2022-06-23  本文已影响0人  pyihe

前言

Bitmap实际上并不是一种数据类型,而是定义在String类型上的面向位的操作。因为String是二进制安全的并且最大长度为512MB,所以String可以建立2^32个不同的位。位操作被分为两种:

Bitmap最大的一个优点是当存储信息时可以节省极大的空间。例如一个系统中的用户ID由递增的ID表示,只需使用512MB的内存,就可以记住40亿用户的单比特信息(例如,知道用户是否想收到通讯)。

Bitmap使用SETBITGETBIT命令设置和获取位的值:

> SETBIT key 10 1
> GETBIT key 10

SETBIT命令第一个参数表示需要被设置的位,第二个参数表示需要设置的值(1或者0)。需要注意的是,当被设置的位超过字符串当前的长度时,SETBIT命令将会自动增加字符串的长度。GETBIT返回指定位上的值,对于超过字符串当前长度范围的位,总是被视为0。

Bitmap有三个命令是基于对一组位进行操作的命令:

  1. BITOP:在不同字符串之间执行逐位的操作,Redis提供的操作有的:ANDORXOR
  2. BITCOUNT:统计值为1的位数
  3. BITPOS:获取第一个被设置位0或者1的位

BITPOSBITCOUNT都可以对字符串的字节范围进行操作,Bitmap的常见使用场景有:

比如想统计网站最长的用户连续访问天数,可以使用Bitmap,每个位的值作为该天是否访问网站的标志(第一位表示第一天,第二位表示第二天,以此类推),每当用户访问网站时可以使用SETBIT设置该天对应的位为1,最后统计连续设置为1的位的数量即可。使用BITCOUNT可以统计出用户访问网站的天数,使用BITPOS即可统计出最长的连续访问天数。为了分片数据集,最好避免使用大键,可以让每个键存储M个位,将(位数/M)的值与键名关联,将(位数%M)可以获取位数处于键内的位置。

下面是Bitmap相关命令。

BITCOUNT key [ start end [ BYTE | BIT]]

BITFIELD key GET encoding offset | [OVERFLOW WRAP | SAT | FAIL] SET encoding offset value | INCRBY encoding offset increment [ GET encoding offset | [OVERFLOW WRAP | SAT | FAIL] SET encoding offset value | INCRBY encoding offset increment ...]

BITFIELD_RO key GET encoding offset [ encoding offset ...]

BITOP operation destkey key [key ...]

BITPOS key bit [ start [ end [ BYTE | BIT]]]

GETBIT key offset

SETBIT key offset value

参考资料

Redis Bitmap
原文连接

上一篇 下一篇

猜你喜欢

热点阅读