【问题标题】:Count unique users in last 60 mins per page with Redis HyperLogLog使用 Redis HyperLogLog 计算每页过去 60 分钟内的唯一用户数
【发布时间】:2020-07-05 10:26:51
【问题描述】:

我正在设计一种算法来计算一组页面上的唯一用户,基于 60 分钟的滑动比例

因此,它需要找到访问特定页面的唯一 IP(或令牌),并在过去 60 分钟内汇总这些访问次数

我需要它在规模上非常快(主要是写作,但阅读是一种奖励)。每页可以有 10,000 个用户乘以 1000 个页面。

我的研究表明我将 Redis 与 HyperLogLog 结合使用

我是来自 Memcache 背景的 Redis 新手。谁能给我指点?

谢谢

【问题讨论】:

    标签: algorithm redis hyperloglog


    【解决方案1】:

    这样做的一种方法是为每个页面/每组页面保留一个 HLL 密钥,并具有分钟的分辨率。例如,如果我们正在跟踪“index.html”并且当前时间戳为 0,则 ID 为“abc”的访问者可以通过以下方式跟踪:

    PFADD index.html:0 abc
    

    一旦一分钟过去了 - 即简单起见,时间戳 1 - 诸如“def”之类的访问者将被添加到下一个键中:

    PFADD index.html:1 def
    

    等等。要计算过去 60 分钟的唯一访问者数量,假设当前时间戳为 100,您需要调用 PFCOUNT 命令并为其提供所有这 60 个键的名称,例如:

    PFCOUNT index.html:100 index.html:99 ... index.html:41
    

    注意:如果您希望清除“旧”计数,请在每次调用 PFADD 后调用 EXPIRE

    【讨论】:

    • 我想通过使用HLL 与此类似,但我认为多个PFCOUNTs 不会消除多个HLL 上的重复,我错了(再次检查文档)。很好的答案
    【解决方案2】:

    您无法在单个 HyperLogLog 键中获取时间间隔。

    排序集可能是一种选择;

    • 您将用户添加到排序集中,作为他们的进入日期作为分数,他们的用户 ID 作为值,ZADD
    • 您可以使用ZCOUNT 获取该时间间隔内的唯一用户总数。例如,我使用小数字作为时间戳。
    127.0.0.1:6379> ZADD activeusers:page:1 1 a1
    (integer) 1
    127.0.0.1:6379> ZADD activeusers:page:1 1 a2
    (integer) 1
    127.0.0.1:6379> ZADD activeusers:page:1 3 a5
    (integer) 1
    127.0.0.1:6379> ZADD activeusers:page:1 116 a7
    (integer) 1
    127.0.0.1:6379> ZCOUNT activeusers:page:1 60 inf
    (integer) 1
    127.0.0.1:6379> ZRANGEBYSCORE activeusers:page:1 60 inf
    1) "a7"
    

    当您使用ZCOUNT 时,您将定义MIN 为(当前时间 - (60*60)) 和 MAXinf,因此它需要介于 (现在 - 3600 秒) 和 (现在)。

    这个缺点之一是,您需要通过使用 ZREMRANGEBYSCORE 手动从这些集合中删除旧数据

    127.0.0.1:6379> ZREMRANGEBYSCORE activeusers:page:1 -inf 59
    (integer) 3
    127.0.0.1:6379> ZRANGEBYSCORE activeusers:page:1 -inf inf
    1) "a7"
    127.0.0.1:6379> ZRANGEBYSCORE activeusers:page:1 -inf inf WITHSCORES
    1) "a7"
    2) "116"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2017-11-12
      • 2023-01-23
      • 2017-05-06
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多