使用redis中的键

时间:2012-04-04 19:17:51

标签: redis key-value-store

我是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的所有键)

2 个答案:

答案 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是一个数据结构服务器,因此您需要考虑数据结构和访问路径。你想要:

  • 存储值一次
  • 能够访问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命令进一步优化以减少往返次数。 查看示例in this answer

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