我正在研究 Redis 支持的数据结构,但找不到可以让我理解 HyperLogLog 是什么的解释。
我如何使用它,为什么这有好处?
基本上是一种 Redis Set
,它使用优化的算法通过避免大量内存消耗来计算元素。Set
a和 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命令的对应关系: