我正在使用一个redis数据库,我已经实现了访问redis服务器的Python代码,问题是实现的代码非常复杂,不易维护。
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
,我得到了按field1
排序的id
字段列表:
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
的特殊用法)可以帮助获得按二级索引排序的键?
**注:**也欢迎提供有关此主题的有用链接。
1条答案
按热度按时间q3qa4bjr1#
这是我第一次使用Redis,如果我把它和SQL查询进行比较,我认为它的使用是SQL数据库的更复杂的方面
事实上,Redis的主要目标是性能,它的数据结构和命令都是基于这一点设计的。Redis中没有原生二级索引,因为保留一个二级索引的成本是不可忽略的:事实上,the guide you referenced展示了一种模式,你可以用它来 * 模仿 * 一个数据库,因为它使用的数据类型只是一个排序集--这是Redis生态系统中的第一个公民。
如果你想在Redis中使用多个索引,那么我建议你在创建/修改/删除主键的同时创建和维护多个键(使用前面提到的排序集合数据类型就可以了)。