【问题标题】:How to sort Redis list of objects using the properties of object如何使用对象的属性对 Redis 对象列表进行排序
【发布时间】:2022-11-14 13:37:09
【问题描述】:

我有 JSON 数据(见下文),我使用“rpush”将其存储在 Redis 列表中,键为“person”。 防爆数据:

[
  { "name": "john", "age": 30, "role": "developer" },
  { "name": "smith", "age": 45, "role": "manager" },
  { "name": "ram", "age": 35, "role": "tester" },
]

现在当我使用lrange 人 0 -1,它给我的结果是'[object object]'。

因此,为了实际使用属性名称获取它们,我通过对它们进行字符串化并将它们解析回对象以使用对象属性来存储它们。

但是转换为字符串的问题是我无法使用任何属性对它们进行排序,比如姓名、年龄或角色。

我的问题是,如何将此 JSON 存储在 Redis 列表中并使用任何属性对其进行排序。

谢谢。

【问题讨论】:

  • 您是否有理由不将它们存储为 JSON? Redis 有一个 RedisJSON 扩展,它也包含在 Redis Stack 中。
  • 是的,我尝试使用 RedisJSON,但无法在我的服务器上启用它。
  • 我建议尝试更多,用字符串类型的条目实现你想要做的事情是一个很大的痛苦。使用环境的任何详细信息搜索“redis 模块”或“启用 redis json”。
  • 是的,我一直在努力。顺便说一句,我们在 RedisJSON 上有排序功能吗?我还看到 RedisJSON 仅适用于 Redis Enterprise Cloud 订阅。那正确吗?我没有。
  • 我现在在我的服务器上启用了 RedisJSON。但是我找不到任何命令来对使用它存储的数据进行排序。

标签: redis ioredis


【解决方案1】:

最近我针对一个非常相似的问题发布了an answer

最简单的方法是使用 Redis Search 模块(这使得该方法可移植到许多客户端/语言):

  • 将每个需要的对象存储为单独的键,遵循前缀键模式(名为prefix:something 的键)和标准模式(所有用户键都是 JSON,并且都包含要排序的字段)。
  • 使用FT.CREATE 创建搜索索引,使用ON JSON 参数搜索JSON 类型的键,并可能使用PREFIX 参数仅搜索用户类型的键,以及所有需要的搜索的x AS y 参数字段,其中x 是字段名称,y 是字段类型(TEXTTAGNUMERIC 等 -- 参见documentation),可选地添加SORTABLE 到字段如果他们需要被分类。
  • 使用FT.SEARCH 命令与"@field=value" 搜索参数的任意组合,以及可选的SORTBY

否则,可以使用KEYS 命令获取遵循模式的所有键,并使用手动语言特定的排序代码。这当然涉及更多,取决于语言和可用的库,因此可移植性较差。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多