2012-04-04 165 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實際上是主鍵,那麼它可以被簡化,因爲不需要引入額外的鍵來標識值。