2012-04-04 126 views
2

我是Redis和键值数据库中的新成员。你能否建议我在redis中正确实现这种关系方法?使用redis中的密钥

我有关系表中有两个关键,一个值:

-master_id; -slave_id; -value。

实施例:

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

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

  • master_id:值

  • slave_id:master_id

这样做,你必须查询两次服务器的缺点通过slave_id获取/删除/修改一个值。 (你首先查询slave_id,服务器响应master_id(如果有的话),然后你查询master_id做相关值的东西)。尽管如此,只要LUA scripting到达,这不会成为问题。

0

在这个例子中,我不明白主键只是master_id还是(master_id,slave_id)。我假设后者。

尝试将关系概念映射到键/值存储通常毫无意义。 Redis是一个数据结构服务器,因此您需要考虑数据结构和访问路径。你想:

  • 存储值一次
  • 能够从master_id字段访问值
  • 能够从slave_id字段访问值

您需要:

  • 数字键将识别值
  • as每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> 

检索对应掌握ID1和ID2从属值:

SINTER master:id1 slave:id2 
MGET <result of the previous command with a value: prefix> 

它可以进一步优化通过使用SORT命令以减少往返次数。 查看示例in this answer

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