我是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
out
排序集会发生什么?答案 0 :(得分:1)
使用排序集是Redis中进行分页的标准方法。
documentation of ZINTERSTORE说:“如果destination
已经存在,它将被覆盖。”
因此,您不应使用“ out”作为目标键名称。相反,您应该使用唯一的或足够随机的密钥名称,然后在完成后将其删除。
我不确定您所说的“有意义”是什么意思。如果那是您希望他们进入的顺序,这是一个很好的选择。