简单地说,我们现在是Redis
尽管名称听起来很复杂,但概率数据结构是相对简单的数据结构,对于大规模解决流分析问题非常有用。
概率数据结构大量使用信息理论中的概念(例如哈希)以使您对数据的某些特性有一个大致的看法。相对于完整和精确的描述,您可能更喜欢近似的描述,因为与传统数据结构相比,它们节省了大量的存储空间,并提供了出色的性能。
流分析是性能和空间节省极为重要的一种情况。与批处理分析不同的是,流分析是关于提供对无限制大小的数据集的洞察,这些数据集不断流进分析引擎。这些数据集的无边界特性使某些传统方法无法使用,这使得概率数据结构成为数据工程师的宝贵工具。
让我们来看看一些实际的例子,在这些例子中,Redis可以帮助你使用概率数据结构进行大规模的分析。在下面的例子中,我们将看到HyperLogLog,它是Redis的一部分,以及其他数据结构(布鲁姆过滤器,TopK,Count-min草图)RedisBloom, Redis开发的Redis模块。
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 home-uniques
此命令将返回过滤器中唯一项的总数。更有趣的是,当一次调用多个计数器时,PFCOUNT将在计数前执行set union,这意味着存在于多个计数器中的任何元素将只被计数一次。
PFCOUNT blogpost1-uniques blogpost2-uniques
这个命令将返回从两个计数器的并集计数的唯一视图。这是很有用的,因为通过将这个数字除以单个独特页面浏览量的总和,您还将得到两个页面之间的相关性的衡量。
HLL计数器还支持一个名为PFMERGE,这与PFCOUNT在多个计数器上被调用时所执行的操作(例如,set union)基本相同。
Bloom过滤器回答集合成员问题(例如,“这个元素是集合的一部分吗?”)。它们还可以极大地节省空间,但与HLL不同的是,它们所需的空间大小取决于您计划添加的元素数量以及您愿意接受的错误率。给你一个粗略的概念,一个Bloom过滤器大小为100万个条目(任何大小),错误率为1%,占用大约1MB的存储空间。
关于错误率
在HLL中,错误率表现为总计数与实际数略有偏差。在Bloom过滤器中,错误概率影响正答案。换句话说,当您询问Bloom过滤器是否包含给定元素时,答案要么是“可能是”,要么是“绝对不是”。
用法示例
Bloom过滤器可以用来回答以下问题:
创建Bloom过滤器
要创建具有特定设置的Bloom过滤器,必须使用男朋友。储备:
男朋友。保留被禁止的url 0.001 100000
该命令为100K元素创建一个错误率为0.1%的过滤器。该命令还有一些关于自动伸缩的可选参数。自动缩放是RedisBloom的一个特性,当达到容量限制时,它会自动增加更多的内存到过滤器中。我们仍然需要指定目标容量,因为自动伸缩特性背后存在性能影响,这意味着您希望在任何可能的情况下获得正确的初始估计,仅在必要时才依赖自动伸缩。
添加元素
要向Bloom过滤器添加元素,必须使用男朋友。添加或男朋友。MADD(一次添加多个元素):
男朋友。添加crawled-urls google.com facebook.com
非常简单。如果你想一次添加多个元素,请看一下男朋友。MADD如果你想跳过男朋友。保留步骤,可以任选配置默认大小适用于所有滤镜,或使用男朋友。插入.
测试集员
要测试一个元素是否属于集合的一部分,必须使用男朋友。存在或男朋友。MEXISTS(一次测试多个元素):
男朋友。MEXISTS抓取-urls google.com reddit.com
测试成员非常快,但是如果过度使用,自动缩放功能可能会产生负面影响。每次扩展过滤器时,它都需要在更多的可选地点寻找该项目。每次检查仍然会非常迅速地进行,但是选择一个糟糕的基本大小可能需要过滤器扩展足够多的时间,以影响该命令的性能。
删除元素
Bloom过滤器不支持删除添加到过滤器中的元素,但好消息是,RedisBloom还包括一个布谷鸟过滤器,可以替代Bloom过滤器它还支持条目删除.
Count-min草图(厘米的草图)回答项目频率问题。在某些方面厘米的草图是类似于HyperLogLog的,因为它们都计算元素,但关键的区别是厘米的草图不计算唯一的元素,而是计算添加到其中的每个元素的拷贝数。
一些问题的例子厘米的草图可以回答:
和前面的例子一样,这里有一些不精确的地方。在…的情况下CM素描,问题是,它总是高估计数.高估的程度取决于您在创建计数器时指定的选项。
使用
与Bloom滤镜类似,厘米的草图需要您指定一些设置在创建每个过滤器时.之后就只剩下添加元素它和查询统计.像高级语言一样,厘米的草图还支持合并多个计数器成一个。
这里是一个快速的纲要厘米的草图使用会话类似于redis-cli。
> CMS。> CMS. INITBYPROB word-freqs1)(整数)10 2)(整数)5 3)(整数)17 > CMS。1)(整数)10 2)(整数)0
TopK基本上是附加到Count-min Sketch等概率频率计数器上的常规堆。结果是,TopK将使用频率估计在内存中只保留“top K”元素,其可配置值为K。
如果厘米的草图能够告诉您给定元素的频率,TopK还能够返回元素本身,如果它们的频率足够高的话。在这里描述的所有数据结构中,这是唯一能够返回(部分)您放入其中的元素的结构。因此,这些元素的大小在空间使用方面很重要。
在这里您可以找到完整的命令列表TopK支持的RedisBloom。
下面是在redis-cli中TopK使用会话的快速概述。
> TOPK。保留畅销书2 OK > TOPK。INCRBY畅销书HP 5 LOTR 10 WITCHER 140 1) (nil) 2) (nil) 3) HP > TOPK。INCRBY最畅销的HP 50 1) LOTR > TOPK。COUNT畅销书HP LOTR WITCHER 50GRAY 1)(整数)55 2)(整数)10 3)(整数)140 4)(整数)0 > TOPK。1)《HP》2)《巫师》
要了解更多关于概率数据结构的流分析,请查看RedisBloom,阅读文档,并旋转一个Docker容器来使用它。如果你正在寻找将Redis整合到你的流媒体分析管道中的方法,那就来看看吧复述,流.