2

我是 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 验证1 2:1 验证2

我只能通过全键 1:1 或 2:1 访问值。我不能做这样的东西 DEL * :1 (删除第二部分等于 1 的所有键)或 GET 1: * (获取键的第一部分等于 1 的所有键)

4

2 回答 2

0

为避免值重复,您可以使用这样的普通键/值对:

  • master_id : 值

  • slave_id : master_id

This has the drawback that you have to query twice the server to get/delete/modify a value by slave_id. (You first query for the slave_id, the server responds with the master_id if any and then you query master_id to do stuff with the value associated). This will not be an issue as soon as LUA scripting arrives, though.

于 2012-04-04T20:37:34.533 回答
0

在示例中,我不明白主键是否只是 master_id 或 (master_id,slave_id)。我假设后者。

尝试将关系概念映射到键/值存储通常是没有意义的。Redis 是一个数据结构服务器,所以需要从数据结构和访问路径的角度来考虑。你想要:

  • 将值存储一次
  • 能够访问 master_id 字段中的值
  • 能够访问 slave_id 字段中的值

你需要:

  • 用于识别值的数字键
  • 每个 master_id 的集合以索引相应的值
  • 每个 slave_id 一个集合来索引相应的值

例子:

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 命令进一步优化以减少往返次数。请参阅此答案中的示例。

当然,如果master_id实际上是主键,那么可以简化,因为不需要引入额外的键来识别值。

于 2012-04-04T20:39:06.163 回答