关闭

用Redis bitmap统计活跃用户、留存

13739人阅读 评论(1) 收藏 举报
分类:

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

      原文:http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/

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

  NoSQLFan:用Redis bitmap统计活跃用户

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

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

  这样一次记录的复杂度是O(1),在Redis中速度非常快。

  而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。

  如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。为样我们通过对N天的活跃用户记录取并集操作,就能得出在N天内活跃过的用户列表。

  NoSQLFan:用Redis bitmap统计活跃用户

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

  NoSQLFan:用Redis bitmap统计活跃用户

  下面是具体的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();
  }

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

==========================================================================

      看完这篇文章后,我测试了一下:
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1

对使用大的offset的 SETBIT 操作来说,第一次内存分配可能造成 Redis 服务器被阻塞.因为Redis需要生成很长的二进制系列。
问题:

如果活跃用户在百万级别,使用Redis BitMap很划算。

如果如果活跃用户很少,而用户id都是10位以上的int。那就很浪费内存了。那还不如使用set集合呢。然后求交集就可以了。

我们可以计算内存:offset = 999 999 999 =》需要的内存999 999 999/8/1024/1024 = 119M左右。

如果统计的数据还有很多维度,且维度组合有上千种,使用这个方式就不划算。我们可以借鉴bitmap使用另外的方式来统计活跃留存:

留存的指标:
    次日注册留存、
    2日注册留存...
    N日注册留存,
    比如昨天注册了1000名用户中,在今天有300名用户又登录了,那么对应于昨天的注册留存就是30%;
从总体上看,这些指标依赖于核心变量——用户访问时间。
那我们可以使用bitMap来记录用户访问时间:

如果我们统计时间是从2013年开始,那么2013-01-01就是bit的第一位...以此类推,
2013年的最后一天,即是bit位的第365位。

这样我们已经记录用户所有天的是否登录。
然后我们计算留存:
留存计算:
  1) 计算当天时间,对应对应的bit位,如今他是7月01日,bit位是182.
  2)次日留存:
     查看bit的(182-1)=181位是否存在,若存在,留存数+1
     N日留存: 
     查看bit的(182-n)位是否存在,若存在,n日留存数+1
我们再来估算占用空间。一年365bit位。1000万用户,占用的空间=1000万 * 365bit/8 /1024/1024 = 430M

4
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

redis 用setbit(bitmap)统计活跃用户

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图...
  • lglgsy456
  • lglgsy456
  • 2014-09-19 10:34
  • 16268

redis bitmap实现签到

Bitmap 对于一些特定类型的计算非常有效。 假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户A上线了多少天,用户B上 线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加be...
  • czh0423
  • czh0423
  • 2015-11-06 14:29
  • 1411

用Redis bitmap统计活跃用户、留存

Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。       原文:http://blog.getspool.com/2011/1...
  • mergerly
  • mergerly
  • 2016-11-16 17:05
  • 1068

用Redis bitmap统计活跃用户、留存

Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。       原文:http://blog.getspool.com/2011/11/...
  • u013699800
  • u013699800
  • 2015-03-02 17:41
  • 318

用Redis bitmap统计活跃用户、留存

用Redis bitmap统计活跃用户、留存 分类: NOSQL 大数据处理      Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网...
  • codepython
  • codepython
  • 2015-06-11 11:05
  • 429

用Redis bitmap统计活跃用户、留存

Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。       原文:http://blog.getspool.com/2011/1...
  • codepython
  • codepython
  • 2015-11-23 12:43
  • 614

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

本文来自Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作。 Redis支持对String类型的value进行基于二进制位的置位操作。通过将一...
  • zhanghe687
  • zhanghe687
  • 2016-02-19 10:39
  • 252

redis 用setbit(bitmap)统计活跃用户

getspool.com的重要统计数据是实时计算的。Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间。在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的...
  • woshihaiyong168
  • woshihaiyong168
  • 2017-01-10 13:16
  • 242

利用Redis BitMap 统计用户活跃指标

bitMap原理 :     如下: index 从 0 到 9 ,依次对应到一个bit位上,如果index 代表用户id,bit位上的0 1分表 代表用户是否登录; 1   ...
  • q412774506
  • q412774506
  • 2015-07-22 16:00
  • 291

redis位图法统计活跃用户

redis解决实际问题-----位图法统计活跃用户
  • qq_35596210
  • qq_35596210
  • 2017-04-07 16:26
  • 765
    个人资料
    • 访问:7614479次
    • 积分:32567
    • 等级:
    • 排名:第167名
    • 原创:222篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1684条
    感谢您支持,努力做更好

    扫码打赏,你说多少就多少

    最新评论