什么是hyperloglog,为什么这有用?

时间:2018-03-13 17:07:02

标签: database redis hyperloglog

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

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

1 个答案:

答案 0 :(得分:5)

基本上是一种Redis Set,它使用优化算法通过避免大量内存消耗来计算元素。 SetHyperLogLog之间的区别在于,使用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 = SADD
  • PFCOUNT = SCARD
  • PFMERGE = SUNION