APP下载
报价宝  ›  科技  › 

Redis Bitmap实现每日活跃使用者统计

报价宝 来源:baojiabao.com 发布时间:2019-11-05 17:05:00 09月19日更新
报价宝综合消息Redis Bitmap实现每日活跃使用者统计

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程式码片段为给定的使用者操作和日期计算唯一使用者。

import redis.clients.jedis.Jedis;

import java.util.BitSet;

...

Jedis redis = new Jedis("localhost");

...

public int uniqueCount(String action, String date) {

String key = action + ":" + date;

BitSet users = BitSet.valueOf(redis.get(key.getBytes()));

return users.cardinality();

}

下面的程式码片段计算给定给定使用者操作的唯一使用者和日期列表

import redis.clients.jedis.Jedis;

import java.util.BitSet;

...

Jedis redis = new Jedis("localhost");

...

public int uniqueCount(String action, String... dates) {

BitSet all = new BitSet();

for (String date : dates) {

String key = action + ":" + date;

BitSet users = BitSet.valueOf(redis.get(key.getBytes()));

all.or(users);

}

return all.cardinality();

}

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 数码相机价格 汽车价格 笔记本价格 笔记本电脑价格 耳机价格