UV(独立访客):即Unique Visitor,访问网站的一台电脑客户端为一个访客,24小时内相同的客户端 只被计算一次
用户量小,可以使用Redis的set集合来进行统计
每有1个请求,就用sadd将用户ID添加进去,然后通过scard取值,即为UV数据
如果一个页面有几千万的UV,就需要一个很大的set,很浪费空间
如果有十个或更多页面,怎么办?只是为了统计UV,就要用掉这么多空间,不值得
所以要用到Redis的HyperLogLog
基础命令
pfadd:新增
pfcount:获取总数
**
**
也可批量新增
**
**
pfmerge:数据合并
比如手机和显卡,都属于电子产品,那么它们的UV数据其实可以合并
**
**
缺点
HyperLogLog的缺点就是统计会有误差
**
**
1000条少了10条,再执行一遍,依旧少了10条,而且总数依然是990,说明可以去重
public static void main(String[] args) {
Jedis jedis = new Jedis();
for (int i = 0; i < 1000; i++) {
jedis.pfadd("userName", "xcr" + i);
}
long total = jedis.pfcount("userName");
System.out.println("1000 --- " + total);
jedis.close();
}
}
至于更大的数据量,可以自己去测试(服务器太辣鸡,一万条数据都插不进去…)
误差率不会太大,对于统计UV来说,并不影响
结语
只要用了HyperLogLog数据结构,它就要占用12k存储空间,它不适合统计单个用户的相关数据
至于什么时候用,海量用户,几亿,就用它,相比于set已经节约很多空间了
Redis对HyperLogLog进行了优化,用了稀疏矩阵存储
随着计数的变大,超过了阈值会变成稠密矩阵,才会占用12k存储空间
参考书籍:Redis 深度历险:核心原理与应用实践