HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法。

HyperLogLog是在大数据量的情况下关于数据基数的空间复杂优化实现,而布隆过滤是在大数据量情况下关于检索一个元素是否存在于一个集合中的空间复杂优化后的实现。

在传统的数据量较低的应用服务中,我们实现数据基数和数据是否存在分析的功能,通常是简单把数据存储下来,直接count一下就是基数了,而直接检索一个元素是否存在集合中也是非常简单。

但是随着数据量的急剧增大,传统方式已经很难达到工程上的诉求了。海量数据无论是在存储还是在查询方面都存在巨大的挑战,无论是使用位存储还是树结构存储来优化,都没有办法达到大数据时代要求。  于是HyperLogLog与布隆过滤器这两个算法就很好的派上用场。他们的使用可以极大的节约存储空间,作为代价,则是牺牲了一个小概率的准确性,这可以很好的达到工程上的需求,对于那些要求准确度没那么高,但数据量巨大的需求是非常合适的。

HyperLogLog原理

最直白的解释是,给定一个集合 S,对集合中的每一个元素,我们做一个哈希,假设生成一个 16 位的比特串,从所有生成的比特串中挑选出前面连续 0 次数最多的比特串,假设为 0000000011010110,连续 0 的次数为 8,因此我们可以估计该集合 S 的基数为 2^9。当然单独用这样的单一估计偶然性较大,导致误差较大,因此在实际的 HyperLogLog 算法中,采取分桶平均原理了来消除误差。(这段话引用了 HyperLogLog 原理  中的描述,还有一些细节实现 感兴趣可阅读 https://blockchain.iethpay.com/hyperloglog-theory.html)

特点:实现牺牲了一定的准确度(在一些场景下是可以忽略的),但却实现了空间复杂度上的极大的压缩,可以说是性价比很高的。

虽然基数不完全准确,但是可以符合,随着数量的递增,基数也是递增的。

布隆过滤器原理

布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k,以上图为例,具体的操作流程:假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置为0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。注意:此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。可以从图中可以看到:假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,这是误判率存在的原因。(这段话与图片引用于 布隆过滤器(Bloom Filter)的原理和实现  中的描述,还有一些细节实现 感兴趣可阅读 https://www.cnblogs.com/cpselvis/p/6265825.html)

特点:巧妙的使用hash算法和bitmap位存储的方式,极大的节约了空间。

由于主要用的是hash算法的特点,所有满足和hash算法相同的规则:当过滤器返回 true时(表示很有可能该值是存在的),有一定概率是误判的,即可能不存在;当过滤器返回false时(表示确定不存在),是可以完全相信的。

我们换个数据的角度来看规则:当数据添加到布隆过滤器中时,对该数据的查询一定会返回true;当数据没有插入过滤器时,对该数据的查询大部分情况返回false,但有小概率返回true,也就是误判。

   我们知道它最终满足的规则和hash的规则是一致的,只是组合了多个hash,使用了bitmap来存储,大大优化了存储的空间和判断的效率。

redis中的HyperLogLog

在redis中对HyperLogLog 的支持早在2.8.9的时候就有了。它的操作非常简单

  • PFADD  给HyperLogLog添加值
  • PFCOUNT 获取基数
  • PFMERGE 合并两个HyperLogLog数据(完美合并,分别添加和统一添加的结果是一致的)

redis中的布隆过滤器

在redis中的布隆过滤器的支持是在redis4.0后支持插件的情况下,通过插件的方式实现的 ,redis的布隆过滤器插件地址:https://github.com/RedisLabsModules/rebloom

它的操作也很简单,以下为几个主要命令,其它命令请参考文档 https://github.com/RedisLabsModules/rebloom/blob/master/docs/Bloom_Commands.md

参考文章

布隆过滤器(Bloom Filter)的原理和实现

https://github.com/RedisLabsModules/rebloom/blob/master/docs/Bloom_Commands.md

Redis-HyperLogLog

HyperLogLog算法原理及其redis使用

redis的HyperLogLog与布隆过滤器相关推荐

  1. Redis 高级主题之布隆过滤器(BloomFilter)

    最近计划准备整理几篇关于Reids高级主题的博文,本文整理的是关于布隆过滤器在Redis中如何应用,先来一张思维导图浏览全文. 1. 认识BloomFilter 1.1 原理 布隆过滤器,英文叫Blo ...

  2. 开发过程中redis的rehash,布隆过滤器,redis持久化一起解决

    redis的rehash,布隆过滤器,redis持久化一节课搞定 1. 面试中rehash问题分析? 2. 面试中如何解释布隆过滤器? 3. redis持久化有哪些,项目中如何选择? 视频讲解如下,点 ...

  3. 解决Redis缓存穿透之布隆过滤器详解

    文章目录 1. 什么是Bloom Filter(布隆过滤器) 1.1 布隆过滤器优点 1.2 布隆过滤器缺点 1.3 布隆过滤器使用场景 1.4 布隆过滤器检索过程 1.5 布隆过滤器的算法描述 2. ...

  4. Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器? 1.为了省内存,提高速率 2.因为1所以布隆过滤器不需要百分百正确 3.说存在不一定存在,说不存在一定不存在 4.在解决缓存穿透的问题时,拦截了大部分的请求,只有小部分携 ...

  5. 【redis】详解布隆过滤器BloomFilter的原理,使用场景和注意事项

    文章目录 1. 什么是布隆过滤器 2. 实现原理 2.1 HashMap 的问题 2.2 布隆过滤器数据结构 2.3 BloomFilter 的缺点 2.4 如何选择哈希函数个数和布隆过滤器长度 3. ...

  6. Redis 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器

    来源:www.cnblogs.com/Courage129/p/14337466.html 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤 ...

  7. Redis亿级数据过滤和布隆过滤器

    来自:我没有三颗心脏 一.布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求.但是如果我们想知道某一个值是不是已经在 ...

  8. 布隆过滤器 redis_使用基于 Redis 的 Java 布隆过滤器

    (给数据分析与开发加星标,提升数据技能) 转自:ImportNew 布隆过滤器是一种概率数据结构,用来高效地测试集合中是否存在某个元素.使用布隆过滤器有助于减少在磁盘中查找键值的次数,从而降低开销. ...

  9. 这些知识点你会吗?redis的分布式布隆过滤器含答案解析

    问题 老顾先来举个常会问到的面试题:现有50亿个电话号码,现有10万个电话号码,如何要快速准确的判断这些电话号码是否已经存在? 上面的问题可以细化一下,也就是50亿个电话号码在数据库中,现在要快速.准 ...

最新文章

  1. pycharm windows 服务器_环境配置 | Pycharm远程开发的环境配置
  2. xilinx的FPGA动态局部重配置(DPR)
  3. 牛客竞赛语法入门班数组字符串习题【完结】
  4. 开发java程序的步骤_开发 Java 程序的一般步骤是:源程序编辑、 和 。_学小易找答案...
  5. spring boot学习(5): 进程exit code自定义
  6. eclipse集成maven插件
  7. mapreduce 算法_MapReduce算法–了解数据联接第1部分
  8. Tomcat和Weblogic部署纯html文件
  9. Maven学习总结(24)——Maven版本管理详解
  10. 30hibernate_fetch_1_select
  11. hdu 6129 Just do it
  12. Waves 13:一款专业电子音频制作插件和音频信号处理器插件套装
  13. 中国大学生计算机设计大赛 历史作品博物馆
  14. Redhat 更换阿里yum源
  15. 线粒体和叶绿体的基因组特点_线粒体和叶绿体基因组的组织及表达解析.ppt
  16. python批量替换word内容_python win32com 库批量替换word文件内容
  17. 工作5年,从年薪10W到年薪100W:会赚钱的人,都懂规划
  18. bam获取序列_如何从BAM文件中提取fastq
  19. unity python热更新_Unity热更新介绍和测试方法
  20. msf渗透命令和后渗透攻击

热门文章

  1. java的mysql语句规范_常用的标准SQL 语句
  2. JavaScript是如何工作的:Web推送通知的机制
  3. 关于API和SDK的理解
  4. 浅谈,JavaScript 运行机制和Event Loop
  5. 一条开启勇士王朝的短信
  6. 网站被DDOS***怎么防御,推荐网站CDN防御
  7. 网络强制消费案例剖析
  8. FPGA机器学习之学习的方向
  9. struts2整合spring应用实例
  10. 路由重发分之RIP-OSPF