文章目录

  • 1. 位图bitmap
  • 2. 案列


1. 位图bitmap

在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 365 天。如果使用普通的 key/value,每个用户要记录 365 个,当用户上亿的时候,需要的存储空间是惊人的。

为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据一个位,365 天就是 365 个位,46 个字节 (一个稍长一点的字符串) 就可以完全容纳下,这就大大节约了存储空间。

位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。我们可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。

当我们要统计月活的时候,因为需要去重,需要使用 set 来记录所有活跃用户的 id,这非常浪费内存。

这时就可以考虑使用位图来标记用户的活跃状态。每个用户会都在这个位图的一个确定位置上,0 表示不活跃,1 表示活跃。然后到月底遍历一次位图就可以得到月度活跃用户数。

这个类型不仅仅可以用来让我们改二进制改字符串值,最经典的就是用户连续签到。

key 可以设置为 前缀:用户id:年月 譬如 setbit sign:123:1909 0 1

代表用户ID=123签到,签到的时间是19年9月份,0代表该月第一天,1代表签到了

第二天没有签到,无需处理,系统默认为0

第三天签到 setbit sign:123:1909 2 1

可以查看一下目前的签到情况,显示第一天和第三天签到了,前8天目前共签到了2天

127.0.0.1:6379> setbit sign:123:1909 0 1
0
127.0.0.1:6379> setbit sign:123:1909 2 1
0
127.0.0.1:6379> getbit sign:123:1909 0
1
127.0.0.1:6379> getbit sign:123:1909 1
0
127.0.0.1:6379> getbit sign:123:1909 2
1
127.0.0.1:6379> getbit sign:123:1909 3
0
127.0.0.1:6379> bitcount sign:123:1909 
2

2. 案列

连上redis服务器:

redis-cli -p 6383 (端口号填写自己的)

然后使用setbit命令

图片如何保到redis redis怎么存图片_数据库


setbit命令返回的值不一样,这是因为,每一次set的时候,返回的都是这个值上的之前的bit位的值。

bitcount bit:查找key值为bit的bit位为1的个数

bitcount key [start end ] 如果不指定start end 则默认获取全部为1的值的个数
注意 start 和end 指定的是字节的个数,而不是位数组下标