我是Redis和键值数据库的新手。你能否告诉我在redis中正确实现这种关系方法。
我有两个键到一个值的关系表:
-master_id; -slave_id; - 值。
示例:
master_id | slave_id |值
1 | 1 | VAL1
2 | 1 | val2的
通常,master_id字段可以访问值,但有时需要通过slave_id字段进行选择(或删除)。因此,我们可以通过两个字段(master_id或slave_id)获取单个值。在redis中,据我所知,每一个键都意味着一个值。 执行此操作的最佳方法是什么,没有重复价值? 注意:值字段必须是SET或列表类型。
在redis中我们有:
1:1 val1 2:1 val2
我只能通过1:1或2:1的完整密钥访问值。我不能做这样的DEL *:1(删除第二部分等于1的所有键)或GET 1:*(获取键的第一部分等于1的所有键)
答案 0 :(得分:0)
为避免重复值,您可以使用以下简单键/值对:
master_id:value
slave_id:master_id
这样做的缺点是你必须通过slave_id来查询两次服务器以获取/删除/修改一个值。 (您首先查询slave_id,服务器以master_id响应,如果有的话,然后查询master_id以使用相关值执行操作)。但是,只要LUA scripting到达,这就不会成为问题。
答案 1 :(得分:0)
在示例中,我不明白主键是master_id还是(master_id,slave_id)。我假设后者。
尝试将关系概念映射到键/值存储通常是没有意义的。 Redis是一个数据结构服务器,因此您需要考虑数据结构和访问路径。你想要:
你需要:
示例:
SET value:1001 val1
SET value:1002 val2
SADD master:1 1001
SADD master:2 1002
SADD slave:1 1001 1002
要检索与给定主ID相对应的值:
SMEMBERS master:id
MGET <result of the previous command with a value: prefix>
检索与给定从属ID对应的值:
SMEMBERS slave:id
MGET <result of the previous command with a value: prefix>
检索与master id1和slave id2对应的值:
SINTER master:id1 slave:id2
MGET <result of the previous command with a value: prefix>
可以通过使用SORT命令进一步优化以减少往返次数。 查看示例in this answer。
当然,如果master_id实际上是主键,那么它可以简化,因为不需要引入额外的键来识别值。