今天我们来学习一下bitmaps,bitmaps这个“数据结构”可以实现对位的操作。bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。
Bitmaps类型的基础操作
- 获取指定key对应偏移量上的bit值
getbit key offset
- 设置指定key对应偏移量上的bit值,value只能是1或0
setbit key offset value
注意:如果偏移量比较大,前面的位都是置0,所以我们可以减去一个公共数
Bitmaps类型的扩展操作
- 对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
bitop op destKey key1 [key2...]
and 交
or 并
not 非
xor 异或
- 统计指定key中1的数量
bitcount key [start end]
业务场景
电影网站
1、统计每天某一部电影是否被点播
2、统计每天有多少部电影被点播
3、统计每周/月/年有多少部电影被点播
4、统计年度哪部电影没有被点播
解决方案
针对上面4个问题一一解答
1、假设有一部电影名称为《末日宣言》,其id为5。
01010011
id:5
offset:4
0
取得偏移量为4的位为0,所以该部电影没被观看过
2、如下,位数代表id,位数状态为1,代表该电影被看过,为0,代表未被看过
第一天:01010011
第二天:11010111
如果想要统计每天有多少部电影被看过,只需统计某天为1的数量即可
3、统计每周/月/年有多少部电影被点播,只需按天求或即可
0101001
or 1101100
1101101
4、统计年度哪部电影没有被点播
下面我们通过演示进行讲解
执行如下命令:
setbit 20200501 0 1
setbit 20200501 1 1
setbit 20200501 2 1
setbit 20200501 3 1
setbit 20200502 0 1
setbit 20200502 5 1
说明:20200501为日期 后面是电影编号,再后面是值1,也就是代表被看过
查看2020年5月1日所有观看电影数
查看1号和2号被点播的电影数量
最后说一下:bitmaps只是用来对数据进行统计,并不是存储用来存储数据的。