免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5271 | 回复: 1
打印 上一主题 下一主题

[Redis] 使用Redis bitmap进行活跃用户统计 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-16 18:45 |只看该作者 |倒序浏览
使用Redis bitmap进行活跃用户统计







本文来自Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位)



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

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


下面表格表示对应一天,一周,一个月统计时所花费的时间。
  1. Period Time (ms)
  2. Daily 50.2
  3. Weekly 392.0
  4. Monthly 1624.8
复制代码
下面是具体的java代码片断:

1.算出一天的活跃用户数量
  1. import redis.clients.jedis.Jedis;
  2. import java.util.BitSet;
  3. ...
  4.   Jedis redis = new Jedis("localhost");
  5. ...
  6.   public int uniqueCount(String action, String date) {
  7.     String key = action + ":" + date;
  8.     BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
  9.     return users.cardinality();
  10.   }
复制代码
2.计算某几个内活跃用户的数量(某一天活跃就算,所以是取并集)
  1. import redis.clients.jedis.Jedis;
  2. import java.util.BitSet;
  3. ...
  4.   Jedis redis = new Jedis("localhost");
  5. ...
  6.   public int uniqueCount(String action, String... dates) {
  7.     BitSet all = new BitSet();
  8.     for (String date : dates) {
  9.       String key = action + ":" + date;
  10.       BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
  11.       all.or(users);
  12.     }
  13.     return all.cardinality();
  14.   }
复制代码
具体的用法还很多,比如你还可以对独特终端的用户单独记一个bitmap,这样就可以统计不同终端用户的活跃情况。有的同学会说用set也能实现同样的效果。但使用set在内存使用量上是会大很多的。

如果你还有其它Redis好玩的应用场景。也欢迎通过NoSQLFan分享给更多朋友。

来源:blog.getspool.com

论坛徽章:
0
2 [报告]
发表于 2012-02-17 22:51 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP