Redis Bitmaps的使用

Bitmaps是Redis支持的一种数据结构,value是一个长字符串,字符串上每一个字符的值只能是 0 或 1。看起来像是一个二进制的数据结构,其实只是一个字符串,所以严格来说Bitmaps并不是一个新的数据结构,而是一个符合特殊约定的字符串。

下面先来看一下Redis中和Bitmaps相关的几个命令:

1.常见命令

设置值
bitset key offset value

bitset 命令可以设置key的第offset位的值,下标从 0 开始计算。value值只能为 0 或 1。

其中offset是一个无符号的int类型,如果offset不是整型或者超出int类型的范围会报错。

获取值
getbit key offset

getbit 命令可以查询key的第offset位的值。

统计value为 1 的个数
bitcount key [start] [end]

bitcount 命令可以统计key对应的字符串中value为 1 的字符个数,其中start和end为可选参数,用于统计指定下标之间的结果。

与或非运算
bittop and/or/not/xor destkey key [key ...]

其中:
- and:交集
- or:并集
- not:非
- xor:异或

bittop是一个复合操作,会计算出多个key结果的交并补集,然后将结果存到destkey中。

获取第一个值为targetBit的偏移量(offset)
bitpops key targetBit [start] [end]

可以使用 bitpops 命令计算出第一个结果为targetBit的偏移量,其中start和end为可选参数,用于在指定下标之间的查询结果。

2.使用场景

由于Bitmap数据结构的特殊机制,value值只有 0 和 1 两个结果,可以使用Bitmap来帮我们记录一些布尔型的结果。比如说记录用户是否访问网站,用户是否对文章点赞等等,前提是用户的唯一标识需要是int类型。

比如说一个网站有 1 亿用户,id使用自增长的类型,我们需要记录每天用户的访问记录。

如果使用Set类型来帮我们记录结果的话,可以使用sadd命令添加用户id到一个Set集合中

sadd 20180903:user id [id ...]

查看当天网站的用户访问量可以使用 scard 命令查出Set集合中元素中的个数

scard 20180903:user

但是随着访问用户越来越多,Set集合中的元素会越来越多,占用内存会越来越大,内存会随着用户访问量而增长。

如果使用Bitmaps来实现统计用户访问记录,可以使用 setbit 命令将用户id对应的value设置为 1

bitset 20180903:user id 1

查看当天网站访问量可以使用 bitcount 命令查出value为 1 的数量

bitcount 20180903:user

查询两天同时访问网站的用户数量可以使用 bittop 命令中的与运算

bittop and 20180903:user 20180904:user

使用Bitmaps来统计网站访问量不会因为用户访问量的增加而增大内存的使用。

在活跃度很高的网站使用Bitmap来统计网站访问量可以帮我们避免了Set类型无限增长的问题,节省内存。但是如果网站活跃度很低,使用Set类型开存储用户访问记录不会产生一个很大的集合,但是使用Bitmap会产生一个很长的“二进制”字符串,这个时候使用Bitmap就比使用Set更加浪费内存。

3.总结

Bitmaps使用一种很特殊的数据结构来存储数据,使用一个类似于二进制的字符串,每一位使用 0 和 1 来标识某个id的结果,很适合用于一些统计网站活跃度、文章是否点赞等场景。

Bitmaps的优点在于提供的这种数据结构可以帮我们在数据量大的场景下节省内存,缺点在于在数据量不大的场景下可能更加浪费内存,并且要求offset必须是int类型。

所以Redis提供的Bitmaps这个数据结构能够帮我们解决一部分问题但它也不是万能的,我们需要在合理的场景去使用它。


喜欢这篇文章的朋友,欢迎扫描下图关注公众号lebronchen,第一时间收到更新内容。
Redis Bitmaps的使用_第1张图片

你可能感兴趣的:(Redis)