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实现每日活跃用户统计的主要内容,如果未能解决你的问题,请参考以下文章

今年遇到的PHP面试题--Redis

Redis使用BitMap用户签到统计BitMap解决缓存击穿方案 及 UV(HyperLogLog) 统计页面访问量 与 独立访问量

redis特殊数据类型Bitmaps

活跃用户统计

[Redis] Redis日常学习总结一

redis中的Setbit位图法统计活跃用户