常规操作之Redis进阶

一、HyperLogLog

非精准求和,相比于常规的add与hadd不同的是在每次插入的时候并不是实际将值插入到集合中而是大体估算一下集合中钙元素的总值。

伪代码,大体算法如此
     max = 0
     对于集合中的每个元素:
               hashCode = hash(元素)
               num = hashCode二进制表示中最前面连续的0的数量
               if num > max:
                   max = num
     最后的结果是2的(max + 1)次幂  

Redis中对于HyperLogLog只提供了pfadd 与pfcount两种操作,对于数据的求和大概误差率在0.81%,而且只少不多。

二、布隆过滤器

精确大数据查重(实际上也不是很精确,会存在小概率的数量错误,错误率取决于限定的数组大小,存放数据越疏越精确),Redis 4.0 之后支持布隆过滤器插件。

1.布隆过滤原理

布隆过滤器内置数据结构是一个大型的位数组和多个不一样的无偏(Hash均匀)Hash函数构成。进行添加操作时会使用多个不同的Hash函数对添加的值进行计算,得到多个不同整数型地址值,将不同位置的地址值全部设置为1即改数值已经存入。
求证是否存在时只需要验证Key的几个Hash函数对应的地址值是否都置位1,若存在一个不为1的值则认为该Key不存在。
优点:大数据(上亿数据量)查询速度快,同样数据量查询所需容量只有哈希表的1/8到1/4。(布隆过滤器实际上建立的是位数组并不是哈希表的value数组)
缺点:因为只用位来判断是否存在所以数据存储的疏密、Hash函数的无偏以及查询所使用的的Hash函数个数会对查询结果造成较大的影响,会造成误判的结果,补救方式:建立较小的白名单用来存储可能误判的value。

2.使用语法

  • bf.add 添加元素
  • bf.exists 判断单个元素
  • bf.madd 批量添加
  • bf.mexists 批量判断

3.实际使用场景对比

比如说,一个象 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿个 email 地址, 就需要 1.6GB 的内存(用哈希表实现的具体办法是将每一个 email 地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB, 即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。
今天,我们介绍一种称作布隆过滤器的数学工具,它只需要哈希表 1/8 到 1/4 的大小就能解决同样的问题。
布隆过滤器是由巴顿.布隆于一九七零年提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。我们通过上面的例子来说明起工作原理。
假定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址 X,我们用八个不同的随机数产生器(F1,F2, …,F8) 产生八个信息指纹(f1, f2, …, f8)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数 g1, g2, …,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个 email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。(见下图)

现在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单中。我们用相同的八个随机数产生器(F1, F2, …, F8)对这个地址产生八个信息指纹 s1,s2,…,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是 t1,t2,…,t8。如果 Y 在黑名单中,显然,t1,t2,…,t8 对应的八个二进制一定是1。这样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值