【发布时间】: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