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

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

最佳答案

基本上是一种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
  • 关于database - 什么是 super 日志,为什么这样做有好处?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49261930/

    10-15 07:23