首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

使用Redis bit地图进行活跃用户统计

2012-07-03 
使用Redis bitmap进行活跃用户统计本文来自Spool的开发者博客,描述了Spool利用具体的代码类似下面这样:red

使用Redis bitmap进行活跃用户统计

本文来自Spool的开发者博客,描述了Spool利用

具体的代码类似下面这样:

redis.setbit(play:yyyy-mm-dd, user_id, 1)

这样一次记录的复杂度是O(1),在Redis中速度非常快。
而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。
如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。为样我们通过对N天的活跃用户记录取并集操作,就能得出在N天内活跃过的用户列表。
使用Redis bit地图进行活跃用户统计

下面表格表示对应一天,一周,一个月统计时所花费的时间。

PeriodTime (ms)Daily50.2Weekly392.0Monthly1624.8

下面是具体的java代码片断:

1.算出一天的活跃用户数量

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();  }

2.计算某几个内活跃用户的数量(某一天活跃就算,所以是取并集)

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();  }

具体的用法还很多,比如你还可以对独特终端的用户单独记一个bitmap,这样就可以统计不同终端用户的活跃情况。有的同学会说用set也能实现同样的效果。但使用set在内存使用量上是会大很多的。

转自http://blog.nosqlfan.com/html/3501.html

热点排行