【问题标题】:Use of secondary indexes in a redis database in comparison with SQL statementsRedis数据库中二级索引的使用与SQL语句对比
【发布时间】:2023-01-14 22:19:37
【问题描述】:

我正在使用 redis 数据库。我已经实现了 Python 代码来访问 redis 服务器。问题是实现的代码非常复杂,不易维护。

Redis 数据库中的二级索引

为了简化问题,我假设在我的数据库中存在一组由以下命令插入的 4 个键:

hset key:1 id 1 field1 1001
hset key:2 id 2 field1 999
hset key:3 id 3 field1 1002
hset key:4 id 4 field1 1000

上一组键按字段 id 排序。我已经使用Redis文档的Secondary indexing guide来实现二级索引来获取按field1排序的键列表。
为此,根据guide,我创建了一个排序集通过以下命令在数据库中调用zfield1

zadd zfield1 1001 1
zadd zfield1 999 2
zadd zfield1 1002 3
zadd zfield1 1000 4

排序集zfield1 由字段field1 排序。

使用命令 zrange 我得到了 id 字段的列表,由 field1 排序:

zrange zfield1 0 -1
1) "2"
2) "4"
3) "1"
4) "3"

zrange获得的列表的第一个元素是"2",这个元素提供了获取field1值较低的键的所有值的信息。因此,通过以下命令,我可以获得与 key:2 相关的所有键值:

hgetall key:2
1) "id"
2) "2"
3) "field1"
4) "999"

通过执行命令hgetall 的同花循环,我可以获得按field1 排序的所有键值。

与 SQL 数据库比较

我认为前面的演示是以下 SQL 查询的实现(其中 TABLE1 是通用 SQL 数据库中的表):

SELECT * from TABLE1 order by field1

这是我第一次使用 Redis,如果我将它与 SQL 查询进行比较,我认为它的用法是 SQL 数据库的更复杂方面。 所以我怀疑是否还有其他更简单的方法可以使用 Redis 将 SQL 查询实现为 SELECT * from TABLE1 order by field1

问题

有人可以判断是否有其他 Redis 命令(例如 Redis 命令 KEYS 的特定用法)有助于获取按二级索引排序的键?

笔记:也欢迎提供有关此主题的有用链接。

【问题讨论】:

  • 您是否检查过 Redis 的 RediSearch 模块(Redis-Stack 的一部分)?
  • 我在寻找解决方案时找到了它,但我没有使用它。您认为它可以帮助以更简单的方式进行查询(有时很复杂)吗?
  • 当然,RediSearch 为您提供了非常广泛的查询 API。参见:redis.io/commands/ft.searchredis.io/commands/ft.aggregate

标签: python sql database redis nosql


【解决方案1】:

这是我第一次使用 Redis,如果我将它与 SQL 查询进行比较,我认为它的用法是 SQL 数据库的更复杂方面

确实:Redis 的主要目标是性能,其数据结构和命令在设计时就考虑到了这一点。没有本国的Redis 中的二级索引,因为保留一个索引的成本不可忽略:事实上,the guide you referenced 显示了一种模式,您可以使用它来模仿一,作为使用的数据类型,只有一个排序集——这是 Redis 生态系统中的第一个公民。关系数据库是完全不同的野兽。

如果你想使用多个指标在 Redis 中,然后我建议在创建/修改/删除主键时创建和维护多个键(使用上述排序集数据类型就可以了)。

【讨论】:

  • 谢谢你的回答告诉我,我认为我使用 Redis 的方式是正确的,事实上,当我创建/修改/删除键时,我维护了多个排序集。如果我提到我的问题,我需要执行按日期时间间隔选择键的查询,并且所选键必须按另一个索引排序返回,该索引在示例中为 field1。这意味着我已经创建了 2 个排序键和很多代码行来获得结果。有时我认为这不是正确的工具,但在这一点上我必须继续。谢谢,如果您可以添加一些其他提示。
  • 不客气。我相信 Redis 是一个很棒的工具:是否将其视为合适的产品实际上取决于您的业务需求。如果您有能力离开 SQL 的舒适区而采用不同的模型和数据类型以提高系统速度,那么是的,Redis 可能真的是正确的工具。但我相信关系数据库也是一个很好的解决方案。也许您可以考虑在您的应用程序中同时使用 SQL 和 NOSQL,以充分利用这两个类别。
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多