尚硅谷bilibili视频讲解:https://www.bilibili.com/video/BV1Rv41177Af?p=15
简介
现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图
合理地使用操作位能够有效地提高内存使用率和开发效率。
(1)
Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。
(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
命令
# 设置Bitmaps中某个偏移量的值(value值为0或1),偏移量从0开始
setbit <key> <offset> <value>
# 获取Bitmaps字节数组中某个偏移量的值
getbit <key> <offset>
# 统计字符串从start字节到end字节比特值为1的数量 (0 到 -1)表示0到最后
bitcount <key> [start end]
# bitop是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或)
# 操作并将结果保存在新的destkey中。
bitop and (or/not/xor) <destkey> [key…]
Bitmaps与set对比
假设网站有1亿用户, 每天独立访问的用户有5千万, 如果每天用集合类型和Bitmaps分别存储活跃用户可以得到表
很明显, 这种情况下使用Bitmaps能节省很多的内存空间, 尤其是随着时间推移节省的内存还是非常可观的