什么是 hyperloglog,它有什么用?

What is hyperloglog and why is this good for?

我正在研究 Redis 支持的数据结构,但未能找到可以让我理解什么是 HyperLogLog 的解释。

我如何使用它,为什么它有好处?

基本上是Redis的一种Set,使用优化算法统计元素,避免大量消耗内存。 SetHyperLogLog 之间的区别在于,使用 HyperLogLog 您可以添加、计算唯一元素并将一些 HyperLogLogs 合并到另一个 HyperLogLog 中,所以基本上您不会将成员存储在 HyperLogLog 中您可以在 SET 中执行并检索它们,您只需存储不同成员的出现,这就是 HyperLogLog 不提供检索其存储成员的命令的原因。

一个明确的用例可能是,如果你想拥有一个巨大的 SET,你想在其中计算集合中唯一数据数量的这么多倍,你对集合中的哪些数据不感兴趣,你是即使集合增长很多,也只对消耗低内存感兴趣。例如,假设您有一个具有大量用户且所有用户都非常活跃的高影响力系统,并且您有兴趣了解系统每个网页中的唯一身份访问者的数量。您想要更新 real-time,因此您将每秒查询每个网站的唯一身份访问者。您可以为系统中的每个 URI 创建一个 HyperLogLog,它将代表该网页,并且每次用户访问 URL 您都会 PFAAD user_id:

PFAAD /api/show/concerts id789989

然后每一秒你将迭代每个 URL-HyperLogLog 以获得独特的数量 user-visitors

PFCOUNT /api/show/concerts

145542

PFCOUNT /api/show/open-airs

25565223

你会说,是的,但我可以通过使用 SET 获得相同的功能,好处是每个集合中的 user_ids 作为成员。是的,你可以,但是你会通过使用集合来消耗大量内存,并且每次(秒)你查询每个集合以使用 SCARD 命令获取唯一访问者的数量,你会花费更多的内存,所以至少你需要存储 user_ids 出于某种原因,HyperLogLogs 作为唯一元素的计数器是更好的选择。对于我们的用例,想象一下有 200-300 个集合,里面有大约 20-30k 的用户。

HyperLogLog与Set命令的对应关系:

  • PFADD = SADD
  • PFCOUNT = SCARD
  • PFMERGE = 联合