Scaling-window 在 Redis 中的评分

Scaling-window ratings in Redis

我使用很棒的 Redis 排序集来给用户打分,然后根据分数快速获得用户评分。另外,我的分数是"weight",所以一个分数可以给用户5分,另一票可以给2分,等等。现在如果有人投票给用户,我就叫

ZINCRBY user:votes <vote_weight> <userId>

但现在我需要根据当前时间戳计算过去一周、一个月、一年的用户评分(如 'moving window')

在 Redis 中最好的方法是什么?

只有当您有兴趣计算从开始到现在的所有选票时,您当前的方法才有效..

让我们关注今天执行此操作的问题 - 这可以通过添加新的排序轻松解决,例如votes:today,并对其元素执行 ZINCR

今天变成明天会怎样?简单 - RENAME 键,例如到 votes:yesterday,或者只使用时间戳开头,这样您将始终更新今天的投票密钥,即 votes:<timestamp day value>

如果您使用时间戳方法,一周后您将得到 7 个键 - 每天打开 - 每个用户得分。得到上周的结果很简单,就是得到这 7 个关键的成员并总结他们的分数。你甚至可以即时完成。 1m0、3mo、6mo、12mo 等等也是如此……但是。

但是,如果你想为 12mo(~= 365 个键)做这件事,你将需要更多的 RAM(用于将这些键存储在 Redis 中)并且完成聚合需要更长的时间,自然。您可以通过结合 Redis 的密钥过期功能(例如,将一天的密钥的 TTL 设置为 12mo 以仅保留一年的历史记录)并保持 运行 动态更新的聚合(即每次投票)来解决这个问题) 或定期(每天、每周、每月等)。请注意,相同的脚本可以执行内务处理和 delete/archive 旧数据,可能解决显式过期的需要。