如何获得SMEMBERS结果的子集?还是应该对分数和成员使用具有相同值的SortedSet?

时间:2019-02-26 08:52:46

标签: redis

我是Redis的新手。例如,如果我具有以下架构:

(顺便说一句,我不确定如何在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个ID,也要返回所有ID?这样有效吗?如果集合中有数百万个值,但我只想要10个,该怎么办?

非常感谢。

Edited1 :顺便说一句,我使用的是 而不是 列表 和< strong> 已排序的集合 ,因为我将需要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. 对分数和成员使用相同的值有意义吗?

1 个答案:

答案 0 :(得分:1)

  1. 使用排序集是Redis中进行分页的标准方法。

  2. documentation of ZINTERSTORE说:“如果destination已经存在,它将被覆盖。”

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

  3. 我不确定您所说的“有意义”是什么意思。如果那是您希望他们进入的顺序,这是一个很好的选择。