2

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

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

4

1 回答 1

6

基本上是一种 Redis Set,它使用优化的算法通过避免大量内存消耗来计算元素。Seta和 a之间的区别在于HyperLogLog,使用 HyperLogLog 您只需添加、计算唯一元素并将一些 HyperLogLog 合并到另一个中,因此基本上您不会像在 SET 中那样将成员存储在 HyperLogLog 中,然后检索它们,您只是存储不同成员的出现,这就是 HyperLogLog 不提供检索其存储成员的命令的原因。

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

PFAAD /api/show/concerts id789989

然后每秒你将迭代每个 URL-HyperLogLog 以获得唯一用户访问者的数量

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 = 悲伤
  • PFCOUNT = SCARD
  • PFMERGE = SUNION
于 2018-03-13T22:47:46.800 回答