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