文档章节

HyperLogLog简介

SEOwhywhy
 SEOwhywhy
发布于 07/17 22:06
字数 1026
阅读 5
收藏 0

  (1)HyperLogLog简介
  
  在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。HyperLogLog适用于大数据量的统计,因为成本相对来说是更低的,最多也就占用12kb内存
  
  业务场景,HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计
  
  举个例子,假如要统计一个页面的访问量(PV),这个还比较好办,可以直接用redis计数器或者直接存数据库都可以做,然后如果再加需求,现在要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样的话,你可能会想到用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应userId,这种方法是可行,可是访问量一多的话,假如有几千万访问量,那就麻烦了,为了统计一个访问量,要频繁创建SET集合对象
  
  那有其它方法吗?针对上面大访问量的情况,redis是有实现了HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet 教授
  
  Redis集成的HyperLogLog使用语法主要有pfadd和pfcount,顾名思义,一个是来添加数据,一个是来统计的,使用比较容易掌握,不过算法是比较复杂的,然后为什么用pf?是因为HyperLogLog 这个数据结构的发明人 是Philippe Flajolet教授 ,所以用发明人的英文缩写,这样我们也容易记住这个语法了
  
  下面给出一些简单例子,启动redis客户端
  
  127.0.0.1:6379> flushall
  
  OK
  
  127.0.0.1:6379> pfadd uv user1
  
  (integer) 1
  
  127.0.0.1:6379> pfcount uv
  
  (integer) 1
  
  127.0.0.1:6379> pfadd uv user2
  
  (integer) 1
  
  127.0.0.1:6379> pfcount uv
  
  (integer) 2
  
  127.0.0.1:6379> pfadd uv user3
  
  (integer) 1
  
  127.0.0.1:6379> pfcount uv
  
  (integer) 3
  
  127.0.0.1:6379> pfadd uv user4
  
  (integer) 1
  
  127.0.0.1:6379> pfcount uv
  
  (integer) 4
  
  127.0.0.1:6379> pfadd uv user5 user6 user 7 user8 user9 user10
  
  (integer) 1
  
  127.0.0.1:6379> pfcount uv
  
  (integer) 10
  
  127.0.0.1:6379>
  
  然后用java的Jedis库来实现
  
  加上Maven:
  
  <dependencies>
  
  <dependency>
  
  <groupId>redis.clients</groupId>
  
  <artifactId>jedis</artifactId>
  
  <version>2.9.0</version>
  
  </dependency>
  
  </dependencies>
  
  写个测试类,要先启动redis服务端
  
  package com.test.redis;
  
  import redis.clients.jedis.Jedis;
  
  public class RedisPFCountTest {
  
  public static void main(www.jmaguojiyL.com String[] args) {
  
  Jedis jedis = new Jedis(www.feishenbo.cn"127.0.0.1",6379);
  
  for (int i = 0; i <www.zzxcscl.com 1000; i++) {
  
  jedis.pfadd("pv"www.zheshengjpt.com, String.valueOf(i));
  
  }
  
  long total = jedis.pfcount("pv");
  
  System.out.printf("%d\n", total);
  
  jedis.close();
  
  }
  
  }
  
  在这里插入图片描述
  
  再加大数据量,这里写了10万次的统计,可以看出是有一点误差的
  
  在这里插入图片描述
  
  当然HyperLogLog算法一开始就是为了大数据量的统计而发明的,所以很适合那种数据量很大,然后又没要求不能有一点误差的计算,HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,不过这对于页面用户访问量是没影响的,因为这种统计可能是访问量非常巨大,但是又没必要做到绝对准确,访问量对准确率要求没那么高,但是性能存储方面要求就比较高了,而HyperLogLog正好符合这种要求,不会占用太多存储空间,同时性能不错
  
  (2) PFMERGE 用法
  
  pfadd和pfcount常用于统计,然后来个需求,假如两个页面很相近,现在想统计这两个页面的用户访问量呢?这里就可以用pfmerge合并统计了,语法如例子:
  
  127.0.0.1:6379> PFADD test1 "apple" "banana" "cherry"
  
  (integer) 1
  
  127.0.0.1:6379> PFCOUNT test1
  
  (integer) 3
  
  127.0.0.1:6379> PFADD test2 "apple" "cherry" "durian" "mongo"
  
  (integer) 1
  
  127.0.0.1:6379> PFCOUNT test2
  
  (integer) 4
  
  127.0.0.1:6379> PFMERGE test1&test2 test1 test2
  
  OK
  
  127.0.0.1:6379> PFCOUNT test1&test2
  
  (integer) 5

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 151
码字总数 332675
作品 0
私信 提问
Redis——HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。 Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、...

Allenyan
2018/05/13
47
0
redis的HyperLogLog实战

序 本文主要研究一下redis的HyperLogLog的用场 相关命令 pfadd 每添加一个元素的复杂度为O(1) 添加元素到HyperLogLog中,如果内部有变动返回1,没有返回0 pfcount 作用域单个HyperLogLog时,...

go4it
2018/09/07
188
0
使用 Redis 统计在线用户人数

原文地址 使用 Redis 统计在线用户人数 在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录。 本文将介绍四种使用 Redis 对在...

一枼落知天下
01/29
0
0
PostgreSQL sharding : citus 系列6 - count(distinct xx) 加速 (use 估值插件 hll|hyperloglog)

标签 PostgreSQL , hll , hyperloglog , distinct , 加速 , citus.countdistincterror_rate 背景 在分布式数据库中,计算count(distinct xxx),需要对distinct 的字段, 1、去重, 2、重分布...

德哥
04/14
0
0
PostgreSQL 任意列组合条件 行数估算 实践 - 采样估算

标签 PostgreSQL , 优化器 , 采样 , 多列统计信息 , 行评估 , 大表任意维度过滤行数评估 背景 在任意维度查询(ADHoc)的场景中,有诸多技术手段来保证查询的性能,比如rum索引,GIN倒排索引...

德哥
2018/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部