代码之家  ›  专栏  ›  技术社区  ›  Shekhar

在redis中查询

  •  8
  • Shekhar  · 技术社区  · 14 年前

    最近我在学习redis,说实话我对它印象深刻,非常渴望使用它。一直困扰我的一件事是“如何查询redis”。具体来说,我正在努力解决以下问题

    usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...}
    usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...}
    usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...}
    

    请注意,哈希表中有很多键,我只显示了4个。 现在,我想查找特定日期范围内的记录,按用户、按资源或给定时间段内的用户。

    我怀疑有redis特定的模式来检索这些数据。我是一个python程序员。我确实看过redisco(ohm端口),它支持一些查询,但我不确定它是否获得了所有的数据,然后用python进行过滤。

    2 回复  |  直到 14 年前
        1
  •  10
  •   rlotun    14 年前

    对于Redis,在决定如何存储数据之前,最好先了解您希望对数据使用哪种查询模式。

    在上面的示例中,我可以将示例哈希存储为:

     user_to_resource:i = user:j                   # key -> value forward map
     resources => (resource:i, created_timestamp)  # sorted set
     count_resource:i = quantity                   # key -> value quantity map
    

    也就是说,根据我想要支持的查询模式,我有许多正向和反向映射。

        2
  •  7
  •   Shekhar    14 年前

    你提到的问题在很大程度上取决于时间。在这种情况下,明智的做法是使用排序集。您可以使用日期时间戳作为每个条目的分数。

    例如,可以执行以下操作:

    hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842
    hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842
    hmset usage:3 created 20100927 quantity 4 resource 1031 user 76
    
    zadd usage 20200521 1
    zadd usage 20100812 2
    zadd usage 20100927 3
    

    sort usage get 
    # get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user
    

    lrange usage 0 -1
    

    要获取范围的索引,请执行以下操作:

    zrangebyscore usage 20100800 20100900
    

    对于基于散列键值的查询,redis有一个有用的补充,它允许使用lua编写的脚本。您可以很容易地在python heredoc中编写一个简单的lua脚本,并使用redis.eval公司方法将脚本传递给redis。脚本可以是一个循环,它根据您要查找的值进行过滤。