思路,搞一个集合,将当天登陆过的用户的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<Long> 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%左右,但是对于统计用户数这种场景来说足够了。