简单地说,我们现在是Redis

了解更多

基于概率数据结构的流分析

尽管名称听起来很复杂,但概率数据结构是相对简单的数据结构,对于大规模解决流分析问题非常有用。

概率数据结构大量使用信息理论中的概念(例如哈希)为您提供对您数据某些特征的近似观点。您可能正常具有近似值与完整且精确描述的原因是因为在Exchange中,与传统数据结构相比,省略了巨大的存储空间并提供出色的性能。

流分析

流分析是性能和空间节省极为重要的一种情况。与批处理分析不同的是,流分析是关于提供对无限制大小的数据集的洞察,这些数据集不断流进分析引擎。这些数据集的无边界特性使某些传统方法无法使用,这使得概率数据结构成为数据工程师的宝贵工具。

让我们来看看一些实用的例子,其中Redis可以帮助您使用概率数据结构以大规模执行分析。在以下示例中,我们将看到HyperLoglog,它是Redis的一部分和其他数据结构(布鲁姆过滤器top数钟草图)redisbloom.是由Redis开发的Redis模块。

hyperloglog.

HyperLogLog (HLL)统计流中唯一的条目,而不需要记住整个历史。事实上,不管您往HLL计数器中放入多少项,它都会占用最多12KB的内存。最后,HLL计数器的标准错误率为0.81%,对于大多数流分析用例来说,这是一个完美的可持续错误率。

添加新条目

要向HLL计数器添加新物品,必须使用PFADD

pfadd home-uniques“73.23.4.3”“185.23.54.8”“user1@foo.com”“user2@bar.com”在上面的例子中,我们创建了一个HLL计数器来计数我们网站上一个页面的唯一视图,并添加了四个条目:两个由IP标识的匿名用户和两个由他们的电子邮件地址标识的已知用户。

对于HLL计数器,所有的元素都是没有任何特定含义的字符串,所以要由您来为它们提供正确的结构。例如,我们可能想要计算每天的独特页面浏览量,在这种情况下,我们可以像这样构建元素:

PFADD home-uniques "2020-01-01:185.23.54.8" "2020-01-01:user1@foo.com"

这样,来自同一用户的两个视图在不同的日子将产生不同的元素。请记住,每个元素的长度不会影响计数器所消耗的空间量,因为每个条目在插入之前都会被散列。下面介绍的数据结构也是如此。

数数

要从您必须使用的HLL计数器中获取计数pfcount.

pfcount家庭唯一

此命令将返回过滤器中唯一项的总数。更有趣的是,当一次调用多个计数器时,PFCOUNT将在计数前执行set union,这意味着存在于多个计数器中的任何元素将只被计数一次。

pfcount blogpost1-uniques blogpost2-uniques

这个命令将返回从两个计数器的并集计数的唯一视图。这是很有用的,因为通过将这个数字除以单个独特页面浏览量的总和,您还将得到两个页面之间的相关性的衡量。

HLL计数器还支持调用的操作PFMERGE,这基本上是相同的操作,即在多个计数器上调用时pfcount执行(即,设置联合)。

布鲁姆过滤器

Bloom过滤器应答设置成员资格问题(即“是该集合的此元素部分吗?”)。它们还节省了极端空间,但与HLL不同,他们所需要的空间量取决于您计划添加到它们的元素数量以及您愿意接受的错误率。为了给您一个粗略的想法,盛开的过滤器大小为100万项(任何大小),1%错误率占用大约1MB的存储空间。

关于错误率

在HLL中,与实际数量相比,在总数中表明错误率在略微关闭中。在绽放过滤器中,错误概率会影响正答案。换句话说,当您询问绽放过滤器时,如果它包含给定元素,则答案是“可能是”或“绝对没有”。

用法示例

Bloom过滤器可以用来回答以下问题:

  • 这个URL是否恶意?
  • 这个词包含在文件中吗?
  • 这个网址已经爬了吗?
  • 这个条目是否已经出现在流中?

创建Bloom过滤器

要使用必须使用的特定设置创建绽放过滤器男朋友。储备

男朋友。保留被禁止的url 0.001 100000

此命令为100K元素的错误率创建一个0.1%的错误率。该命令需要一些有关自动缩放的参数。自动缩放是重新定义功能,当达到容量限制时自动为过滤器添加更多内存。我们仍然必须指定目标容量,因为自动缩放功能背后存在性能影响,这意味着只有在可能的情况下依赖于自动缩放的初始估计值。

添加元素

要向Bloom过滤器添加元素,必须使用bf.add.或者男朋友。MADD(一次添加多个元素):

bf.add.crawled-urls google.com facebook.com非常简单。如果你想一次添加多个元素,请看一下男朋友。MADD如果你想跳过男朋友。保留步骤,可以任选配置默认大小所有过滤器或使用男朋友。插入

测试集员

要测试一个元素是否属于集合的一部分,必须使用男朋友。存在或者bf.mexists.(一次测试多个元素):

bf.mexists crawled-urls google.com reddit.com

测试成员资格非常快,但这是如果过度使用,自动缩放功能可能会产生负面影响。每次延期滤波器时,它都需要在更替代位置寻找该项目。每个检查仍然很快发生,但选择一个糟糕的基本大小可能需要过滤器来扩展足够的时间来影响该命令的性能。

删除元素

绽放过滤器不支持删除一个元素一旦添加到过滤器后,但好消息是RedisBloom还包括Cuckoo过滤器,这是盛开过滤器的就地替换它还支持条目删除

数钟草图

Count-min草图(CM素描)回答项目频率问题。在某些方面CM素描是类似于HyperLogLog的,因为它们都计算元素,但关键的区别是CM素描不计算唯一的元素,而是添加到它的每个元素的副本。

一些问题的例子CM素描可以回答:

  • 这个用户是否发出了过多的请求?
  • 这个词在文档中有多常见?
  • 更常见的是,这个元素是“重击中”?

与前面的例子一样,涉及一些不精确的效果。如果是CM素描,这个问题是,它总是高估计数.高估的程度取决于您在创建计数器时指定的选项。

用法

与Bloom滤镜类似,CM素描需要您指定一些设置在创建每个过滤器时.之后就只剩下添加元素它和查询统计.喜欢hll,CM素描还支持合并多个计数器成一个。

这里是一个快速的纲要CM素描使用会话在Redis-CLI中看起来像。

> CMS。> CMS. INITBYPROB word-freqs1)(整数)10 2)(整数)5 3)(整数)17 > CMS。1)(整数)10 2)(整数)0

top

Topk基本上是一个常规的堆,附着在概率频率计数器,如Count-Min草图。结果是,POPK将使用频率估计仅在内存中保持“顶部k”元素,以实现K的可配置值。

如果CM素描能够告诉您给定元素的频率,TopK还能够返回元素本身,如果它们的频率足够高的话。在这里描述的所有数据结构中,这是唯一能够返回(部分)您放入其中的元素的结构。因此,这些元素的大小在空间使用方面很重要。

在这里您可以找到完整的命令列表在Redisbloom的Povk支持。

以下是在Redis-CLI中如何快速达到顶级使用会话的样子。

> Topk.Reserve畅销书2 OK> Topk.incry畅销书HP 5 Lotr 10 Witcher 140 1)(NIL)2)(零)3)HP> Topk.incry畅销书HP 50 1)Lotr> Topk。计数畅销书HP Lotor Witcher 50Gray 1)(整数)55 2)(整数)10 3)(整数)140 4)(整数)0> Topk.list畅销书1)HP 2)巫婆

下一步

要了解更多关于概率数据结构的流分析,请查看redisbloom.,阅读文档,并旋转一个Docker容器来使用它。如果你正在寻找将Redis整合到你的流媒体分析管道中的方法,那就来看看吧Redis Streams.

Baidu