用Redis统计日活(基于Redission)

思路,搞一个集合,将当天登陆过的用户的id,存起来,用于统计日活;

目前,用Redis统计日活的方案有3种:
1.使用set集合;
2.使用bitset;
3.使用hyperLogLog;

第一种方案使用set,这种方案不推荐,因为在set里面存一个用户id,就要使用32bit,1亿用户每天就要存3200M。

第二种方案:
先看代码:

public String SimpleBitset(){
    DateTime dt = new DateTime();
    String strDate = dt.toString("yyyyMMdd");
    RBitSet set = redisson.getBitSet("log_"+dt.toString("yyyyMMdd"));
    set.set(0L,true);
    set.set(1L,true);
    // 如果一下子加到4294967295,那么在redis这个键就会达到500多MB
    // 所以如果用户数在百万基本,可以用这种方式,而如果用户数过亿了,会比较消耗内存
    // 如果linux判断redis是个危害,会把它干掉
    // set.set(4294967295L,true);
    // 超过4294967295L就会报错
    // set.set(4294967296L,true);
    // 查询有多少DAU
    System.out.println(set.cardinality());
    return "";
}

用这种方式,有一定限制条件:
1.用户数不能超过4294967296(基本也没几个超得过的吧);
2.它占用的内存大小,不在于存了多少,而在于最大的那个id是多少,比如今天第一个访问的id是100000000,那么这个key的占用内存就会是12M左右(1亿个bit);
如果用户数量也就1亿左右,可以考虑这种方式。

第三种方案:
先看代码:

public String HyperLogLog(){
    RHyperLogLog log = redisson.getHyperLogLog("log");
    log.add(1L);
    log.add(2L);
    log.add(3L);
    log.add(3L);
    log.add(3L);
    log.add(3L);
    log.add(3L);
    log.add(3L);
    log.add(3L);
    log.add(3L);
    log.add(10000000L);
    // 得到的结果是4
    System.out.println(log.count());
    return "";
}

1.它统计1亿用户,大概要1M多点;
2.HyperLogLog的统计结果并不是一个精确的值,误差在0.81%左右,但是对于统计用户数这种场景来说足够了。

你可能感兴趣的:(用Redis统计日活(基于Redission))