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

时间:2014-07-30 11:54:32

标签: redis

所以我有一组用户和一组网站。对于给定的用户,我知道他访问过哪个网站以及何时访问。我有兴趣使用Redis构建API来回答表单中的问题:"网站u的用户w的浏览历史记录中包含多少个唯一日期时间窗口[t0, t1]"?我们拨打该号码f(u,w,t0,t1)。每天由整数d标识(例如,自EPOCH以来的天数)

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

  • 为每对sorted set创建( u, w )。排序集的每个元素都是( score=d, element=d ),其中du访问w的日期。换句话说,set元素与其得分相同。然后f(u,w,t0,t1)只是ZCOUNT( u:w, t0, t1 )
  • 为每对set创建( u, w )。集合中的每个元素都是d。然后要获得f(u,w,t0,t1),我需要迭代该集并计算t0t1之间的天数

我目前的理解是内存使用和速度之间存在折衷(回答查询):第一种解决方案是最快的(我不必遍历整个集合),尽管它是在浪费记忆(相同的数字d同时用作得分和设定元素。)

我的问题是:

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

1 个答案:

答案 0 :(得分:0)

您的理解是正确的...但是这里对第二种方法的优化可能会更好:提供t0t1来查询,构建一个临时集包含这些之间的所有d值。然后,在该临时集和(u,w)之间进行SINTERSTORE。要获得计数,请调整结果集。