2014-10-03 48 views
1

我想创建一个使用Redis的分析密钥方式 - 每个对象的基本计数器,每小时/天/周/月/年,总Redis的用于分析

什么Redis的数据结构将这个是有效的,我怎么能避免对redis进行多次调用?

将它更好地让每个模型都有这个组密钥:

哈希 - model:<id>:years =>每年都有专柜

哈希 - model:<id>:<year> =>每个月都有专柜

哈希 - model:<id>:<year>:<month> =每天>具有计数器

散列 - model:<id>:<year>:<month>:<day> =>每小时具有计数器

如果这个方案是正确的,我将如何绘制这些数据而不需要对redis进行多次调用?我将不得不在model:<id>:years全年循环并获取月份,然后在月份等循环?或者我只是将所有键的所有字段及其值作为批量请求,然后在服务器中处理?

回答

3

最好使用zset而不是散列。 使用timestamp的分数,你将能够检索特定时间范围

数据将要使用model:<id>:<year>:<month>日期范围,一小时范围(使用model:<id>:<year>:<month>:<day>)等等...

事实上,如果日期范围大于一个月(例如2014年1月1日至2014年3月20日),则必须检索多个zset(model:<id>:2014:01,model:<id>:2014:02model:<id>:2014:03)并合并结果。

如果您真的想在单个请求中执行日期范围,您可以始终将日期精度数据存储在model:<id>:<year>之内。如果你想处理多年的日期范围,你只需要一个zset,例如model:<id>:byDay

但是,请注意,存储历史数据会增加内存消耗随着时间的推移所以你应该已经想到了data retention。使用Redis,你可以在zset上使用EXPIRE或者用cron自己做。

+0

谢谢,所以我使用每个模型的单个zset,并且当我想要获取数据时,我使用ZRANGEBYSCORE,其中我提供了最小值和最大值作为日期范围?有没有一个地方可以看到zset的内存消耗,知道保存数据有多远? – 2014-10-04 11:06:32

+1

1 /确实。 2/redis-cli info或Redsmin将帮助您监视全局内存使用情况,但是很遗憾,您无法看到每个zset的内存消耗情况。 – FGRibreau 2014-10-04 14:40:09

+0

如何增加成员的价值?因为得分是我不能使用ZINCRBY – 2014-10-04 14:42:17