个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ⑧Redis HyperLoglog 基本操作命令 HyperLoglog 是用来做基数统计的算法,优点在于当输入元素的数量或者体积非常大时,计算基数所需的空间总是固定且很小的。 基数统计:用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算 Redis中每个HyperLoglog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。 但,HyperLoglog只会根据输入的元素来计算基数,无法存储输入元素本身,所以无法像集合那样返回输入的各个元素。 key [key ...] # 获取hyperloglog的基数数量,可以同时计算多个key的基数数量 pfcount hll1 3. pfmerge 将多个HyperLoglog合并成一个 pfmerge
Redis HyperLogLog Redis 在2.8.9版本添加了HyperLogLog结构。 Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。 在Redis里面,每个HyperLogLog键只需要花费 12 KB 内存,就可以计算接近 2^64个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。 但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。 什么是基数? 命令 下表列出了redis HyperLogLog的基本命令: 序号 命令及描述 1 PFADD key element [element ...]添加指定元素到 HyperLogLog 中。
HyperLogLog是一种概率算法,提供了不精确的去重计数方案,是有误差的基数统计. 基数统计是用来统计一个集合中不重复的元素个数,例如,统计网站的UV或者网站搜索的关键词数量。 这种方法可以大大节省内存,同时保证误差控制在一定范围内.HyperLogLog便是其中一种概率算法. redis中实现的HyperLogLog算法提供了两种存储方式; 一种是密集存储,只需要12K内存, HyperLogLog是一个很复杂的算法,这里只简单说明下其计算过程. 首先需要准备一定数量的桶,用来记录各桶内元素的数量.
通过Redis的HyperLogLog对象能高效地统计基数。 利用HyperLogLog命令可以在一个键上同时添加多个值。 其中,sourcekey是待合并的对象,可以是一个或多个;destkey是合并后HyperLogLog的键,如果合并前destkey不存在,则会新建一个。 4、统计网站访问总人数 利用HyperLogLog统计访问人数的方法。 在实际项目里,可能访问列表会很长,用HyperLogLog统计的性能比较快,另外还能用较小的存储空间代价来完成通国际访问总人数的工作。
HyperLogLog并不是一种新的数据结构(实际类型是字符串类型),而是一种计数算法。而是一种基数算法。 pfadd 添加元素,如果添加成功返回1 127.0.0.1:6379> pfadd 2019-04-29:unique:ids u1 u2 u3 u4 (integer) 1 pfcount 计算一个或多个HyperLogLog :6379> pfcount 2019-04-29:unique:ids (integer) 5 pfmerge pfmerge destkey sourcekey [sourcekey ] 计算多个HyperLoglog 2019-04-29:unique:ids 2019-04-30:unique:ids OK 127.0.0.1:6379> pfcount 2019-04:unique:ids (integer) 7 HyperLogLog 毕竟HyperLogLog 内存占用量非常小
本文链接:https://blog.csdn.net/u014427391/article/details/95992173 (1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。 HyperLogLog适用于大数据量的统计,因为成本相对来说是更低的,最多也就占用12kb内存 业务场景,HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计 举个例子,假如要统计一个页面的访问量 针对上面大访问量的情况,redis是有实现了HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet 教授 Redis集成的HyperLogLog使用语法主要有 当然HyperLogLog算法一开始就是为了大数据量的统计而发明的,所以很适合那种数据量很大,然后又没要求不能有一点误差的计算,HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确
基本介绍 HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。 基数是什么? 添加指定元素到 HyperLogLog 中。 2 PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。 将多个 HyperLogLog 合并为一个 HyperLogLog pfadd Pfadd 命令将所有元素参数添加到 HyperLogLog 数据结构中。 pgmerge Pgmerge 命令将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的
但是,因为 HyperLogLog 只会根据输入元素来计算基数,并不会储存输入元素本身,所以 HyperLogLog 不能像集合那样能返回输入的各个元素。 2. 什么是基数? 对于多个键,返回的是多个 HyperLogLog 并集的基数估算值,通过将多个 HyperLogLog 合并为一个临时的 HyperLogLog 计算基数估算值。 可以使用 HyperLogLog 只使用很少且恒定的内存来计算集合的不同元素个数。每个 HyperLogLog 只用 12K 加上键本身的几个字节。 时间复杂度:O(N),N是要合并的HyperLogLog的数量。 PFMERGE 命令将多个 HyperLogLog 合并为一个 HyperLogLog。 合并后的 HyperLogLog 的基数估算值是通过对所有给定 HyperLogLog 进行并集计算得出的。计算完的结果保存到指定的键中。
HyperLogLog是Redis的高级数据结构,它在做基数统计的时候非常有用,每个HyperLogLog的键可以计算接近264不同元素的基数,而大小只需要12KB。 如果指定的key不存在,那么就创建一个空的HyperLogLog数据结构。该命令也支持不指定元素而只指定键值,如果不存在,则会创建一个新的HyperLogLog数据结构,并且返回1;否则返回0。 对于多个key,返回的是多个HyperLogLog并集的近似基数,它是通过将多个HyperLogLog合并为一个临时的HyperLogLog,然后计算出来的。 HyperLogLog可以用很少的内存来存储集合的唯一元素。(每个HyperLogLog只有12K加上key本身的几个字节) HyperLogLog的结果并不精准,错误率大概在0.81%。 除了这三个命令,我们还可以像操作String类型的数据那样,对HyperLogLog数据使用SET和GET命令。关于HyperLogLog的原理以及其他细节,我将在明天的文章中进行介绍,敬请期待。
HyperLogLog 什么是 HyperLogLog HyperLogLog 是基于 HyperLogLog 算法的一种数据结构,该算法可以在极小空间完成独立数量统计。 在本质上还是字符串类型。 向HyperLogLog中添加元素 pfcount key1 [key2...] 计算HyperLogLog的独立总数 pfmerge destKey key1 [key2...] 合并多个hyperLogLog到destKey中 演示 ? A:这里要考虑两个因素: hyperloglog 的错误率为:0.81%,存储的数据不能百分百准确。 hyperloglog 不能取出单条数据。api 中也没有相关操作。 如果你没有这两个方面的顾虑,那么用 HyperLogLog 来存储大规模数据,还是非常不错的。
基数估算 HyperLogLog 是一种基数估算算法。所谓基数估算,就是估算在一批数据中,不重复元素的个数有多少。最常见的场景就是统计uv。 redis中实现的HyperLogLog,只需要12K内存,在标准误差0.81%的前提下,能够统计2的64次方个数据。 HyperLogLog 算法简介 伯努利过程 在认识为什么HyperLogLog能够使用极少的内存来统计巨量的数据之前,要先认识下伯努利试验。 hyperloglog过程 过程简单介绍 之前说过,HyperLogLog算法是用来计算基数的,这个抛硬币的序列和基数有什么关系呢? 当 HyperLogLog 插入了少数元素时,可以只使用少量的 XZERO、VAL 和 ZERO 进行表示,如下图所示。
序 本文主要研究一下redis的HyperLogLog的用场 相关命令 pfadd 每添加一个元素的复杂度为O(1) 127.0.0.1:6379> pfadd uv0907 uid1 uid2 uid3 (integer) 1 添加元素到HyperLogLog中,如果内部有变动返回1,没有返回0 pfcount 作用域单个HyperLogLog时,复杂度为O(1),作用于多个HyperLogLog时, 复杂度为O(N) 127.0.0.1:6379> pfcount uv0907 (integer) 3 返回该HyperLogLog的近似基数,如果是指定多个HyperLogLog则返回的是他们的并集的近似基数 HyperLogLog中 使用场景 HyperLogLog是Probabilistic data Structures的一种,这类数据结构的基本大的思路就是使用统计概率上的算法,牺牲数据的精准性来节省内存的占用空间及提升相关操作的性能 doc hyperloglog pfadd pfcount pfmerge HyperLogLogs in Redis hyperloglog的java版使用
所以,简单来说 HyperLogLog 提供不精确的去重计数。 HyperLogLog 的优点: 在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。 二 常见命令 HyperLogLog 命令只有三个,非常简单。 添加指定元素到 HyperLogLog 中 PFADD key element [element ...] 将多个 HyperLogLog 合并为一个 HyperLogLog PFMERGE destkey sourcekey [sourcekey ...] 类型相比,HyperLogLog 就非常节省空间。 所以在统计 UV 时,我们可以用 PFADD 命令(用于向 HyperLogLog 中添加新元素)把访问页面的每个用户都添加到 HyperLogLog 中。
Redis HyperLogLog命令 Redis HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。 编号 命令 描述 1 PFADD key element [element …] 将指定的元素添加到指定的HyperLogLog 中。 2 PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。 3 PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog Redis发送订阅 发送者(发布者)不是计划发送消息给特定的接收者
比如一个HyperLogLog的数据结构只需要花费12KB内存,就可以计算接近2^64个不同元素的基数,而错误率在1.625%. 场景 HyperLogLog一个常用的场景就是统计网站的UV。 doc HyperLogLog的核心思想原理 Probabilistic data Structures – Bloom filter and HyperLogLog for Big Data HyperLogLog
基本介绍 HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。 基数是什么? 添加指定元素到 HyperLogLog 中。 2 PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。 将多个 HyperLogLog 合并为一个 HyperLogLog pfadd Pfadd 命令将所有元素参数添加到 HyperLogLog 数据结构中。 pgmerge Pgmerge 命令将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的
一、HyperLogLog基数统计 HyperLogLog,下面简称为HLL,它是 LogLog 算法的升级版,作用是能够提供不精确的去重计数。存在以下的特点: 代码实现较难。 而 HyperLogLog 却可以用 12K 就能统计完。 1. pfadd元素添加 将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中. 如果一个HyperLogLog的估计的近似基数在执行命令过程中发了变化, PFADD 返回1,否则返回0,如果指定的key不存在,这个命令会自动创建一个空的HyperLogLog结构(指定长度和编码的字符串 了解更多HyperLogLog数据结构,请查阅PFCOUNT命令页面. 返回值 integer-reply 如果 HyperLogLog 的内部被修改了,那么返回 1,否则返回 0 . 将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set
存储一些点之后,就可以让用户给定一个坐标,去从刚才存储的点里进行查找(按照半径,矩形区域…) 在地图领域非常重要 基本命令 GEOADD:添加位置坐标 GEOSEARCH:在给定的范围里面进行查找 HyperLogLog 1 亿 UV >8 亿字节>0.8GB HyperLogLog` 可以最多使用 12 KB 的空间,实现上述效果 之所以 set 要消耗这么大的空间,是因为 set 需要存储每个元素。 而 HyperLogLog 不存储元素的内容,但是能够记录“元素的特征”,从而在新增元素的时候,能够知道当前新增的元素,是一个已经存在的元素,还是一个第一次出现的元素 HyperLogLog 用来计数( 记录出当前集合中有多少个不同的元素),但是不能告诉你这些元素都是什么 HyperLogLog 存储元素的时候,提前特征的过程是不可逆的(信息量丢失了) 给你猪肉,可以做成火腿肠 但是给你火腿肠,不能还原成猪肉了 bitmaps (位图) 使用 bit 位来表示整数 位图本质上,就还是一个集合,属于是 set 类型针对整数的特化版本 为了节省空间 计算机进行位操作,一般都是比较高效的 HyperLogLog
1Flink去重第一弹: MapState去重 2Flink去重第二弹:SQL方式 3Flink去重第三弹:HyperLogLog去重 在HyperLogLog去重实现中,如果要求误差在0.001 实现代码: public class OptimizationHyperLogLog { //hyperloglog结构 private HyperLogLog hyperLogLog; ==null && currSize+1>bucket){ //升级为hyperloglog hyperLogLog=new HyperLogLog(rsd (); } if(hyperLogLog! ,不满足则直接添加到set中,满足则将set里面数据转移到hyperloglog对象中并且清空set, 后续数据将会被添加到hyperloglog中; 这种写法没有考虑并发情况,在实际使用情况中也不会存在并发问题
HyperLogLog是Redis的高级数据结构,是统计基数的利器。 前文我们已经介绍过HyperLogLog的基本用法,如果只求会用,只需要掌握HyperLogLog的三个命令即可,如果想要更进一步了解HyperLogLog的原理以及源码实现,相信这篇文章会给你带来一些启发 在这种情况下,HyperLogLog将会出来拯救我们。 HyperLogLog原理 HyperLogLog实际上不会存储每个元素的值,它使用的是概率算法,通过存储元素的hash值的第一个1的位置,来计算元素数量。这么说不太容易理解,容我先搬出来一个栗子。 在这之前我们首先要了解的是HyperLogLog的头结构体和创建一个HyperLogLog对象的步骤。