Redis ZRANGEBYSCORE返回空集

时间:2014-10-04 14:55:18

标签: redis

这可能是一种愚蠢的行为。

在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)

1 个答案:

答案 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>

注意:

  1. 不能使用此方法轻松完成日期范围,因为您的分数会保留计数。你基本上需要做多个ZSCORE(O(log(N))),循环遍历范围内的每个日期。
  2. 您可以保留其他滚动或静态聚合,以加快常用的范围。
  3. 您必须手动“过期”旧套装会员才能进行内务管理。
  4. 允许范围的替代方法是具备以下条件:

    Sorted set key name pattern: <model>:daily
                                   |
                                   +- Member value: <day timestamp at 12AM UTC>:<count>
                                   +- Member score: 0
    

    在这里,您可以使用ZRANGEBYLEX获取一系列日期,但由于时间戳和计数是连接的,您必须在客户端进行一些处理或使用Lua进行计数(ZSCORE将始终返回0)或者增加它(你不能再使用ZINCRBY了。)