redis操作6 对存储Bitmaps的操作(0 1两种状态的存储 用于打卡,登录记录)

 

Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:
( 1 )Bitmaps本身不是一种数据类型,实际上它就是字符串( key-value ) ,但是它可以对字符串的位进行操作。
( 2 )Bitmaps 单独提供了一套命令,所以在 Redis中使用Bitmaps和使用字符串的方法不太相同。可以把 Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps 中叫做偏移量。

将偏移量(从0开始)作为value中的下标使用,在下标位置的值中放入0或者1       

 

当记录的活跃用户数占总数的比例高的时候,bitmaps相比集合类型要节省非常多的内存,但是如果每天的活跃用户数很少,则bitmaps并不试用。下面以1亿用户,每天分别有5千万和10万来具体分析:

 

 

 

 使用场景:

 

 

 

 

添加一个值到bitmaps中(key:users:202108     偏移量(下标):0       值:1)(代表user在2021年08月第一天打了卡)

 

setbit users:202108 0 1

 

注:
很多应用的用户id以一个指定数字(例如10000 )开头,直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费,通常的做法是每次做setbit操作时将用户id 减去这个指定数字(10000)
在第一次初始化 Bitmaps 时,假如偏移量非常大,那么整个初始化过程执行会比较慢,可能会造成 Redis的阻塞。

 

根据偏移量(下标)取出一个值(1为活跃    0为不活跃(默认值))

getbit users:202108 0

获取值为1的数量

bitcount users:202108

对两个bitmaps做复合操作(and:交集     or:并集    not:非(独有的)    xor:异或(两相同下标位置的值11为0   00为0  其他的为1))

将两个bitmaps组合成一个(and:做交集运算       新bitmaps的key:users:202108_9       之后为将计算的两个bitmaps(2021.8月的活跃数与2021.9月的活跃数))(获取两个月相同的活跃日)

bitop and users:202108_9 users:202108 users:202109

 

 

posted @ 2021-08-07 11:35  低调的。。。  阅读(137)  评论(0编辑  收藏  举报