使用Redis计算给定时间窗口内的共现次数

使用Redis计算给定时间窗口内的共现次数,redis,Redis,所以我有一组用户和一组网站。对于给定的用户,我知道他访问了哪个网站以及访问时间。我感兴趣的是使用Redis构建一个API,以回答以下问题:“在一个时间窗口[t0,t1]期间,用户u浏览网站w的历史记录中包含了多少个独特的天数?”?让我们拨打这个号码f(u,w,t0,t1)。每天由一个整数d标识(例如,自历元起的天数) 我看到了使用Redis对浏览数据建模的两种方法: 为每对(u,w)创建一个排序集。排序集的每个元素都是(分数=d,元素=d),其中d是u访问w的日期。换句话说,集合元素与其分数相

所以我有一组用户和一组网站。对于给定的用户,我知道他访问了哪个网站以及访问时间。我感兴趣的是使用
Redis
构建一个API,以回答以下问题:“在一个时间窗口
[t0,t1]
期间,用户
u
浏览网站
w
的历史记录中包含了多少个独特的天数?”?让我们拨打这个号码
f(u,w,t0,t1)
。每天由一个整数
d
标识(例如,自历元起的天数)

我看到了使用Redis对浏览数据建模的两种方法:

  • 为每对
    (u,w)
    创建一个
    排序集。排序集的每个元素都是
    (分数=d,元素=d)
    ,其中
    d
    u
    访问
    w
    的日期。换句话说,集合元素与其分数相同。那么
    f(u,w,t0,t1)
    就是
    ZCOUNT(u:w,t0,t1)
  • 为每对
    (u,w)
    创建一组
    。集合的每个元素都是
    d
    。然后为了得到
    f(u,w,t0,t1)
    ,我需要迭代集合并计算
    t0
    t1
    之间的天数
我目前的理解是,内存使用和速度(回答查询)之间存在折衷:第一个解决方案是最快的(我不必迭代整个集合),尽管它在浪费内存(分数和集合元素都使用相同的数字
d

我的问题是:

  • 我的理解正确吗
  • 有更好的解决方案吗

    • 您的理解是正确的。。。但第二种方法的优化效果可能更好:提供要查询的
      t0
      t1
      ,构建一个临时集,其中包含这两种方法之间的所有
      d
      值。然后,在该临时集合和
      (u,w)
      的集合之间执行SINTERSTORE。要获得计数,请在结果集上划疤。

      谢谢!我听从了你的建议,使用了
      SINTERSTORE
      。它实际上返回集合交集的基数,因此不需要使用
      SCARD