1、Bitmaps
首先,最经典的应用场景就是用户日活的统计,比如说签到等。
字段串:“dbydc”,根据对应的ASCII表,最后可以得到对应的二进制,如图所示
一个字符占8位(bit),不够就在最高位补 0(零),我们只需设置值为 1 的位。如图所示,二进制最高位是在最左边的,但数组索引最高位是在最右边。字符“d”只需在偏移量(offset,即数组索引)第 1、2、5 位设置 1 ;字符“b”只需在偏移量(offset,即数组索引)第 9、10、14 位设置 1 ;字符“y”只需在偏移量(offset,即数组索引)第 17、18、19、20、23 位设置 1 ;字符“d”只需在偏移量(offset,即数组索引)第 25、26、29 位设置 1 ;字符“c”只需在偏移量(offset,即数组索引)第 33、34、38、39 位设置 1 。
- 字符“d”存储(第 1、2、5 位设置1)
127.0.0.1:6379> setbit mykey 1 1
(integer) 0
127.0.0.1:6379> setbit mykey 2 1
(integer) 0
127.0.0.1:6379> setbit mykey 5 1
(integer) 0
- 字符“b”存储(第 9、10、14 位设置1)
127.0.0.1:6379> setbit mykey 9 1
(integer) 0
127.0.0.1:6379> setbit mykey 10 1
(integer) 0
127.0.0.1:6379> setbit mykey 14 1
(integer) 0
- 字符“y”存储(第 17、18、19、20、23 位设置1)
127.0.0.1:6379> setbit mykey 17 1
(integer) 0
127.0.0.1:6379> setbit mykey 18 1
(integer) 0
127.0.0.1:6379> setbit mykey 19 1
(integer) 0
127.0.0.1:6379> setbit mykey 20 1
(integer) 0
127.0.0.1:6379> setbit mykey 23 1
(integer) 0
- 字符“d”存储(第 25、26、29 位设置1)
127.0.0.1:6379> setbit mykey 25 1
(integer) 0
127.0.0.1:6379> setbit mykey 26 1
(integer) 0
127.0.0.1:6379> setbit mykey 29 1
(integer) 0
- 字符“c”存储(第 33、34、38、39 位设置1)
127.0.0.1:6379> setbit mykey 33 1
(integer) 0
127.0.0.1:6379> setbit mykey 34 1
(integer) 0
127.0.0.1:6379> setbit mykey 38 1
(integer) 0
127.0.0.1:6379> setbit mykey 39 1
(integer) 0
- 获取键 mykey 对应的值
127.0.0.1:6379> get mykey
“dbydc”
所以,我们在统计某位用户系统签到的时候,sign=1就是签到,0就是没有签到。
setbit 2023-jack-sign 1 1 //第一日签到
setbit 2023-jack-sign 2 0 //第二日未签到
setbit 2023-jack-sign 3 1 //第三日签到
...
统计出全年的签到次数:
127.0.0.1:6379> BITCOUNT 2023-jack-sign 0 3 #统计1的数量
(integer) 2