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

对于redis中的分页,如何得到部分SMEMBERS结果?

  •  0
  • sgon00  · 技术社区  · 6 年前

    我是新来的。例如,如果我有以下模式:

    (顺便说一句,我不知道如何在redis中表达变量。我就用这个 <id:product> 作为主键值。在生产中,我将使用golang客户机来完成这项工作)

    INCR id:product
    SET product:<id:product> value
    SADD color:red <id:product>
    

    要查询红色产品,我可以执行以下操作:

    SMEMBERS color:red
    

    但问题是我只想在第一页显示其中的10个,然后在第二页显示下10个,以此类推。如何通过指定offset和limit参数让redis只返回其中的一部分?

    redis专家通常会为这种情况做些什么?即使我只想要10个身份证,也要把所有的身份证都还给我?效率高吗?如果集合中有数百万个值,但我只想要10个呢?

    谢谢。

    顺便说一句,我用 而不是 SINTER 其他查询的作业。

    SADD type:foo <id:product>
    
    SINTER color:red type:foo
    

    然后我又会有分页问题。因为我只想一次找到10个交叉点。(例如:如果交集返回数百万个键,但实际上我一次只需要其中10个用于分页)。

    编辑2:

    我应该改用排序集吗?我不确定这是否是专家的选择。比如:

    ZADD color:red <id:product> <id:product>
    ZADD type:foo <id:product> <id:product>
    
    ZRANGE color:red 0 9        // for the first page of red color products
    
    ZINTERSTORE out 2 color:red type:foo AGGREGATE MIN
    ZRANGE out 0 9        // for the first page of red color and type foo products
    
    1. 我不知道是否有人建议采用上述方法。
    2. out 排序集?
    3. 对score和member使用相同的值有意义吗?
    0 回复  |  直到 6 年前
        1
  •  1
  •   Community CDub    5 年前
    1. 这个 documentation of ZINTERSTORE 他说:“如果 destination 已存在,将被覆盖。“

      因此,不应该使用“out”作为目标键名。相反,您应该使用一个唯一的或足够随机的键名,然后在完成后将其删除。