我使用精美的Redis排序集对用户进行评分,然后快速按分数获得用户评分。此外,我的分数为"权重",因此一个分数可以给用户5分,另一个分数可以给2分等等。现在如果有人为用户投票,我打电话
ZINCRBY user:votes <vote_weight> <userId>
但现在我需要根据当前时间戳计算上周,月,年的用户评分(例如&#39;移动窗口&#39;)
在Redis中执行此操作的最佳方式是什么?
答案 0 :(得分:1)
您目前的做法只有在您有兴趣计算从开始到现在的所有选票时才会有效。
让我们关注今天这样做的问题 - 这可以通过添加新的排序,例如, votes:today
,并对其元素执行ZINCR
。
今天变成明天会发生什么?简单 - RENAME
密钥,例如到votes:yesterday
,或者只是使用时间戳开头,这样您就可以永远更新今天的投票密钥,即votes:<timestamp day value>
如果您使用时间戳方法,一周之后您将获得7个键 - 每天开启 - 每个用户得分。获得上周的结果很简单,只需要获得这7个键即可。成员并总结他们的分数。你甚至可以在飞行中做到这一点。 1m0,3mo,6mo,12mo等也是如此......但是。
但是,如果你想要12mo(〜= 365键),你需要更多的RAM(用于在Redis中存储这些键),自然需要更长的时间来完成聚合。你可以通过结合Redis&#39;来解决这个问题。密钥到期能力(例如,将一天的TTL设置为12mo以保持仅一年的历史记录)并保持运行的聚合(即每次投票)或定期(每天,每周,每月等...)。请注意,相同的脚本可以进行内务处理和删除/存档旧数据,这可能会解决明确使其过期的需要。