Redis 位图 bitmap的使用

bitCount 解决时间窗口统计用户登录天数

SETBIT key offset value
summary: Sets or clears the bit at offset in the string value stored at key
since: 2.2.0
group: string

BITCOUNT key [start end]
summary: Count set bits in a string
since: 2.6.0
group: string

bitcount 是用来统计二进制位中1的个数的

由此我们可以通过bitmap 来存储用户登录天数,1代表用户登录,设一年有400天的话,一个字节是8个二进制位,400天用50个字节就可以存储一年一个用户的登录信息了。
所以我们就可以这样来存储:

setbit  zhangsan 1 1
setbit  zhangsan 2 1
setbit zhangsan 364 1
/*
用 1 来表示该天登录了
第几天:      1  2  3  。。。。。
zhangsan: 0  1  1 。。。。
*/
bitcount zhangsan 0 -1
/*
统计张三当年登录天数
*/
bitcount zhansan -2 -1
/*
统计张三最后两周登录天数
*/
getbit zhangsan  364
/*
如果要精确的进行统计查看第364天是否登录了
*/
/*
如果对天精准存储 可以用下面的方式
*/

key: 用户名/用户ID value:该天是否登录

setbit 的offset 指的是二进制中的索引,getbit也是

bitcount 中的 start 和 end 指的是字节的索引

bitop 检测 随机窗口内活跃用户的统计

BITOP operation destkey key [key ...]
summary: Perform bitwise operations between strings
since: 2.6.0
group: string

可以用key来存储日期,用1来存储某一用户该天是否登录

        zhangsan   lisi       wangwu       ..........
20210918  0         1           1                ..........
20210919  0         1           0                ..........
20210920  1         1           0                ..........
/*
统计20210918和20210919和 20210920三天连续登录
*/
bitop and andkey 20210918 20210919 20210920
bitcount andkey
/*
统计连续三天登录人数
*/

··
key:日期   value: 每一个用户名/用户ID 对应当天是否登录

你可能感兴趣的:(Redis 位图 bitmap的使用)