Redis Bitmap实现每日活跃用户统计
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis Bitmap实现每日活跃用户统计相关的知识,希望对你有一定的参考价值。
参考技术A
Bitmap (又名Bitset)
Bitmap或bitset是一个零和一的数组。可以将位集中的位设置为0或者1,并且将阵列中的每个位置称为偏移。诸如逻辑AND,OR,XOR等操作以及其他按位操作对于位图来说是准确的。
人口数量
Bitmap的填充计数是设置索引的位数1。有计算人口数的有效算法。例如,在Windows开发环境上,包含10亿位的90%填充位组的人口数量为21.1 ms。
Redis中的位图
Redis允许二进制密钥和二进制值。位图只不过是二进制值。 setbit(key, offset, value)操作,需要O(1)时间,一个位的值设置为0或1以指定对于给定的键偏移。
一个简单的例子:每日活跃用户
为了统计今天登录的唯一用户,我们设置了一个位图,其中每个用户都由一个偏移值标识。当用户访问页面或执行保证计数的操作时,将该位设置为1表示用户ID的偏移量。位图的关键是执行的操作用户的名称和时间戳的函数。
假如今天是2019年7月1号,我们设置Redis的位图key为 daily_active_20190701,在这个简单的例子中,每次用户登录时我们都会执行redis.setbit(daily_active_20190701, user_id, 1)。这会将daily_active_20190701位图中的相应偏移量翻转为1.这是一个O(1)操作。对此进行人口统计会导致今天登录的9个唯一身份用户。关键是daily_active_20190701,值是1011110100100101。
当然,由于每日活跃用户每天都会改变,我们需要一种方法来每天创建一个新的位图。我们只需将日期附加到位图键即可。
每天的活跃用户是存储为daily_active_yyyymmdd为key的bitmap中。要 计算每周或每月指标,我们可以简单地计算一周或一个月内所有每天位图的并集,然后计算结果位图的总体数,这将非常轻松地提取更复杂的指标。
使用1.28亿用户进行性能比较
下表显示了针对1.28亿用户在1天,7天和30天内计算的每日独特操作计算的比较。通过组合每日位图计算7和30指标。
示例代码
下面的Java代码片段为给定的用户操作和日期计算唯一用户。
下面的代码片段计算给定给定用户操作的唯一用户和日期列表
以上是关于Redis Bitmap实现每日活跃用户统计的主要内容,如果未能解决你的问题,请参考以下文章
Redis使用BitMap用户签到统计BitMap解决缓存击穿方案 及 UV(HyperLogLog) 统计页面访问量 与 独立访问量