+
80
-

Redis中BitMap怎么使用?

Redis中BitMap怎么使用?

网友回复

+
0
-

BitMap是redis的一种数据类型,属于string,大小不超过512M,位图本质上就是一个普通的字节串,也就是 bytes 数组。您可以使用getbit/setbit命令来处理这个位数组,位图的结构如下所示

BitMap数据类型应用场景

假如有这样一个需求,网站要统计一个用户一年的签到记录,若用 sring 类型存储,则需要 365 个键值对。若使用位图存储,用户签到就存 1,否则存 0。最后会生成 11010101... 这样的存储结果,其中每天的记录只占一位,一年就是 365 位,约为 46 个字节。如果只想统计用户签到的天数,那么统计 1 的个数即可。

位图操作的优势,相比于字符串而言,它不仅效率高,而且还非常的节省空间。

Redis 的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,位数组就会自动扩充。

bitmap操作命令

1) SETBIT命令

用来设置或者清除某一位上的值,其返回值是原来位上存储的值。key 在初始状态下所有的位都为 0 ,语法格式如下: SETBIT key offset value 其中 offset 表示偏移量,从 0 开始。示例如下: 127.0.0.1:6379> SET user:1 a OK #设置偏移量为0 127.0.0.1:6379> SETBIT user:1 0 1 (integer) 0 #当对应位的字符是不可打印字符,redis会以16进制形式显示 127.0.0.1:6379> GET user:1 "\xe1"

2) GETBIT命令

用来获取某一位上的值。示例如下:

127.0.0.1:6379> GETBIT user:1 0

(integer) 1

当偏移量 offset 比字符串的长度大,或者当 key 不存在时,返回 0。

redis> EXISTS bits (integer) 0 redis> GETBIT bits 100000

(integer) 0

3) BITCOUNT命令 统计指定位区间上,值为 1 的个数。语法格式如下: BITCOUNT key [start end] 示例如下: 127.0.0.1:6379> BITCOUNT user:1 (integer) 8 通过指定的 start 和 end 参数,可以让计数只在特定的字节上进行。start 和 end 参数和 GETRANGE 命令的参数类似,都可以使用负数,比如 -1 表示倒数第一个位, -2 表示倒数第二个位。
我知道答案,我要回答