【问题标题】:Redis get range from a Set?Redis 从 Set 中获取范围?
【发布时间】:2012-09-29 00:30:18
【问题描述】:

在 Redis 中是否可以从 Set 中获取一系列项目?

我只注意到给你所有成员的 SMEMBERS。 http://redis.io/commands#set

例如,如果我每次都必须在数百万个项目中使用 SMEMBERS,我只需要从索引 33,456 到 33,466 的 10 个。

每次我要求其中的 10 个时,SMEMBERS 都必须生成包含数百万个项目的完整列表。这不是性能杀手吗?还是因为 Redis 速度快而且就应该这样使用所以没关系?

【问题讨论】:

  • 集合是无序的数据结构。在集合中按范围获取项目是没有意义的。没有索引的概念。也许您应该使用列表或排序集?
  • 仅供参考:从Redis 2.6.0-RC8 开始,现在有一个SRANDMEMBER <count> 命令返回多个随机元素,您可能会觉得这些元素很有用。
  • 您可以使用功能相对丰富的 sort 命令实现您的目标:redis.io/commands/sort

标签: nosql redis


【解决方案1】:

您无法在集合中获得range,因为它是无序,因此没有索引。但是,您可以使用 SMEMBERS

获取集合的所有成员

在redis-cli中

SMEMBERS my_set

另外,ZRange 可能会帮助您在 redis 中使用 Sorted Sets

在redis-cli中

ZRANGE your_key 33455 33465

【讨论】:

    【解决方案2】:

    不,这是不可能的,因为在 Set 数据类型中不存在索引的概念。事实上,SMEMBERS 并不能保证您的具体订单;每次调用时,元素的顺序很可能是随机的。将 Sets 视为事物的无序集合:如果您需要存储一堆共享相同内容的 id,但如果您需要实现分页,则绝对不是要使用的数据类型。也许您正在寻找ListsSorted Sets

    我建议阅读以下内容以了解 redis 中可用的数据类型以及何时使用它们:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多