极速网站建设定制价格,外贸免费开发网站模板,兰州医院网站建设,北京壹零零壹网站建设目录 
前言 
HyperLogLog 前言 
在学习HyperLogLog之前#xff0c;我们需要先学习两个概念 
UV#xff1a;全称Unique Visitor#xff0c;也叫独立访客量#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站#xff0c;只记录1次。PV我们需要先学习两个概念 
UV全称Unique Visitor也叫独立访客量是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站只记录1次。PV全称Page View也叫页面访问量或点击量用户每访问网站的一个页面记录1次PV用户多次打开页面则记录多次PV。往往用来衡量网站的流量。 
如果UV在服务端做会很麻烦因为每次都需要判断该用户是否已经统计过了因此需要保存统计过的用户信息如果都保存在Redis中大型网站的数据量会非常大这种实现方案并不现实。因此我们需要使用HyperLogLog算法。 
HyperLogLog 
该算法又可以叫做HLL算法是从LogLog算法派生的概率算法用于确定非常大的集合的基数而不需要存储其所有值Redis中的HLL是基于String结构实现的单个HLL的内存占用永远不会超过16k相应的代价是测量结果是概率性的存在一定误差但是可以忽略不计。 对应的命令如下 # 添加用户ip
PFADD key element [element ...]
# 统计访问量在存在多个key的情况下会对多个key的访问用户进行去重后再统计
PFCOUNT key [key ...]
# 合并统计量
PFMERGE destkey sourcekey [sourcekey ...] 接下来我们对该方法进行测试首先我们对 hll1 这个key进行插入插入结果如下 那么接下来插入key为 hll2 的数据执行结果结果如下 在 key 为 hll2 的数据完全包含了key为 hll1 的值时我们对两个 key 进行联合统计观察输出结果 可以看到我们的统计结果是进行了去重后再进行统计的。那么接下来测试合并方法 hll2 的数据会合并到 hll1 中该方法的存在我们可以设置ip访问时设置 key 为年月日这样我们可以通过合并每天的key来统计每月的活跃人数。接下来我们测试HLL的内存占用情况 首先是我们先获取没有存储100w数据情况时的内存使用情况需要注意的时该值为字节值需要我们自己转化为kb 测试代码如下我们需要创建100w的对象来模拟访问量通过HLL存储我们测试Redis的占用情况 Test
public void test01() throws Exception {String[] str  new String[1000];int j 0;for (int i  0; i  1000000; i) {j  i%1000;str[j]  useri;if (j  999){stringRedisTemplate.opsForHyperLogLog().add(hll1,str);}}Long count  stringRedisTemplate.opsForHyperLogLog().size(hll1);System.out.println(count);
} 
执行完测试代码后的内存占用情况以及统计结果如下内存占用变为 900992统计次数为 1001788可以看到存在一定误差但是对于100w数据来说基本可以忽略不计。 计算添加完数据后的内存占用900992-886608/1024 ≈ 14k。并且无论执行多少次添加数据操作只要对象不发生改变永远统计到的数量为1001788。