这可能是一种愚蠢的行为。
在redis控制台中执行此操作
zincrby model 1 20140101
zincrby model 1 20141010
zincrby model 1 20141010
为什么这样做
zrangebyscore model 00000000 99999999 withscores
1) "20140101"
2) "1"
3) "20141010"
4) "2"
但这并不是
zrangebyscore model 20140000 20149999 withscores
#> (empty list or set)
答案 0 :(得分:2)
ZRANGEBYSCORE用于分数范围查找,而您正在使用您的成员(在第3个代码段中)。因为1,2 <&lt; 20140000,20149999你什么都没有回来。
在发表一些评论之后编辑
通常,你需要做出关于空间/时间权衡的决定,即更多的RAM和更少的CPU,反之亦然,这实际上取决于你的性能和数据大小要求。通常我会尝试为每个所需的聚合级别跟踪的模型/事件使用排序集。密钥到期很有用,但有时也需要手动从已排序的集合中删除成员。
IIUC,你只需要每个型号的日常计数器,所以按照你的初步设计,我的“架构”可能是:
Sorted set key name pattern: <model>:daily
|
+- Member value: <day timestamp at 12AM UTC>
+- Member score: <count>
使用ZINCRBY增加今天的点击次数:
ZINCRBY <model>:daily 1 <today's timestamp at 12AM UTC>
获取约会的点击次数:
ZSCORE <model>:daily <date timestamp at 12AM UTC>
注意:
允许范围的替代方法是具备以下条件:
Sorted set key name pattern: <model>:daily
|
+- Member value: <day timestamp at 12AM UTC>:<count>
+- Member score: 0
在这里,您可以使用ZRANGEBYLEX获取一系列日期,但由于时间戳和计数是连接的,您必须在客户端进行一些处理或使用Lua进行计数(ZSCORE将始终返回0)或者增加它(你不能再使用ZINCRBY了。)