使用redis hyperloglog计算每页最近60分钟内的唯一用户数

pw136qt2  于 2021-06-10  发布在  Redis
关注(0)|答案(2)|浏览(421)

我正在设计一个算法,以60分钟的滑动比例计算一组页面上的唯一用户
因此,它需要找到唯一的IP(或令牌)已经击中了一个特定的页面,并合计这些点击在过去60分钟
我需要这是非常快的规模(主要是写,但阅读是一个奖金)。我们可以用每页10000个用户乘以1000个页面。
我的研究表明我将redis与hyperloglog结合使用
我是从memcache背景来redis的新手。谁能给我指点一下吗?
谢谢

ny6fqffe

ny6fqffe1#

你不能在一个单一的时间间隔 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 as(当前时间-(60*60))和 MAX 作为 inf ,因此需要(现在-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
  2. "a7"
  3. "116"
y0u0uwnf

y0u0uwnf2#

一种方法是为每个页面/页面集保留一个hll键,分辨率为分钟。例如,如果我们正在跟踪“index.html”,而当前时间戳为0,则id为“”的访问者可以通过以下方式跟踪:

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

注:如果你想“旧”计数被逐出,请致电 EXPIRE 每次呼叫后 PFADD .

相关问题