redis - Redis 中的缩放窗口评级

标签 redis nosql-aggregation nosql

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

ZINCRBY user:votes <vote_weight> <userId>

但现在我需要根据当前时间戳(如“移动窗口”)计算上周、一个月、一年的用户评分

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

最佳答案

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

让我们关注今天这样做的问题 - 这可以通过添加一个新的排序来轻松解决,例如votes:today ,并执行 ZINCR关于它的元素。

当今天变成明天会发生什么?简单 - RENAME关键,例如至 votes:yesterday ,或者只使用时间戳开始,这样您将始终更新今天的投票 key ,即 votes:<timestamp day value>

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

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

关于redis - Redis 中的缩放窗口评级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29510841/

相关文章:

redis - 仅当 SCARD 低于某个值时才 SADD

elasticsearch - Elasticsearch 中的多个分组依据

MongoDB 所有具有整数值的字段的总和

Aerospike AQL count(*) SQL 模拟脚本

hadoop - 将数据导入Hadoop

redis - 如何在 ElasticBeanstalk 上安装和配置 Redis

symfony - Doctrine 二级缓存 w/Redis

python - cassandra.cluster.NoHostAvailable : ('Unable to complete the operation against any hosts' , {})

.net - 将 RavenDB 用于具有复杂用户对象权限模型的解决方案

node.js - 使用 nodeJS 调用 awscli