gpt4 book ai didi

redis - 如何获得 SMEMBERS 结果的子集?或者我应该为分数和成员使用具有相同值的 SortedSet 吗?

转载 作者:可可西里 更新时间:2023-11-01 11:14:39 25 4
gpt4 key购买 nike

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

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

(另外:我不确定如何在 Redis 中表达变量。我将只使用 <id:product> 作为主键值。在生产中,我将使用 golang 客户端来完成这项工作)

要查询有红色的产品,我可以这样做:

SMEMBERS color:red

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

对于这种情况,redis 专家通常会做什么?返回所有 ID,即使我只想要其中的 10 个?那有效率吗?如果集合中有数百万个值,但我只想要 10 个怎么办?

已编辑 1

顺便说一句,我使用集合而不是列表有序集合 因为我需要做 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 使用相同的值有意义吗?

最佳答案

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

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

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

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

关于redis - 如何获得 SMEMBERS 结果的子集?或者我应该为分数和成员使用具有相同值的 SortedSet 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54881577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com