2012-02-24 44 views
7

我認爲我已經掌握了使用Redis的所有命令,但我很難找出使用它的最佳方式。我正在設計一個客戶通知系統,當他們的任何電路出現報警時,系統會通過他們首選的方法(電子郵件,SNMP,Syslog)通知他們。需要幫助在Redis/NoSQL中進行概念化

所以,我得到一個設備名稱和一個端口。我需要將其與單個客戶相關聯,然後將該客戶與交付方法相關聯。使用關係數據庫,它看起來可能看起來像這樣:

Device name: Los_Angeles 
Port: 11 

SELECT Customer_ID, Customer_name from device_info where device_port = 'Los_Angeles:11' 
SELECT Customer_protocol, SNMP_destination, Syslog_destination from CUSTOMER 
    where Customer_ID = <customer_id from above> 

(極大地簡化了示例)。

我可以看到如何用散列哈希或散列哈希編程方式做到這一點。但我想我在Redis中遇到的問題是,那些更復雜的數據結構對我來說是不可用的(據我所知)。那麼,如何將多條信息與單個關鍵字相關聯呢?我可以想到我可以做到這一點的幾種方式,但它們似乎都涉及多個步驟,並且我希望當前的Redis程序員提供一些關於「最佳」方式的輸入。

+0

你看過Redis哈希表嗎?例如,hmset/hmget可讓您將單個密鑰和多個可代表您身份的「字段」相關聯。 http://openmymind.net/2012/1/23/The-Little-Redis-Book/ - Redis Book有一些很好的例子。 – Alex 2012-02-24 06:26:33

+0

我其實沒有看到HMSET/HMGET。在我經歷的教程後,它必定是一個新的增加。我會玩。 – 2012-02-24 16:25:20

回答

10

你是正確的,只有簡單的數據結構可用於Redis,並且它們不能由值構成(就像你可以使用面向文檔的數據庫(如CouchDB或MongoDB))。但是,可以通過引用來組合數據結構,這是一種非常常見的模式。例如,集合中包含的項目可以是其他對象(列表,散列表,其他集合等)的關鍵字。讓我們試着將這個應用到你的例子中。

要模擬客戶與設備+端口之間的關係,可以使用包含客戶ID的集合。爲了存儲關於客戶的信息,每個客戶的一個散列表是好的。

下面是客戶:

hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2 
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2 
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4 

這些記錄的鍵是C:ID

讓我們這些準兩到一個設備和端口:

sadd d:Los_Angeles:11 2 3 

的關鍵這個集合是d:device:port。 c:和d:前綴只是一個約定。 應該創建每個設備/端口一套。給定的客戶可能屬於多個集合(並因此與多個設備/端口相關聯)。

現在要找到附有此設備/端口的傳送方法的客戶,我們只需檢索該設備的內容。

smembers d:Los_Angeles:11 
1) "2" 
2) "3" 

那麼相應的客戶信息,以流水線一些hgetall命令檢索:

hgetall c:2 
hgetall c:3 
1) "name" 
2) "Jackson" 
3) "protocol" 
4) "udp" 
5) "snmp_dest" 
6) "127.0.0.1" 
7) "syslog_dest" 
8) "127.0.0.2" 
1) "name" 
2) "Davis" 
3) "protocol" 
4) "tcp" 
5) "snmp_dest" 
6) "127.0.0.3" 
7) "syslog_dest" 
8) "127.0.0.4" 

不要害怕命令的數量。它們速度非常快,大多數Redis客戶端都具有管理查詢的能力,因此只需要最少的往返次數。通過使用一個smembers和幾個hgetall,只需要兩次往返就可以解決問題。

現在,由於無處不在的SORT命令,可以進一步優化一點。這可能是Redis中最複雜的命令,它可以用來保存這裏的往返。

sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest 
1) "Jackson" 
2) "udp" 
3) "127.0.0.1" 
4) "127.0.0.2" 
5) "Davis" 
6) "tcp" 
7) "127.0.0.3" 
8) "127.0.0.4" 

在一個命令中,它檢索設備/端口集的內容並獲取相應的客戶信息。

這個例子很簡單,但更一般的情況是,儘管您可以用Redis表示複雜的數據結構,但它並不是立竿見影的。您需要在結構和數據訪問方面仔細思考模型(即在設計時,堅持使用您的數據)。

+0

感謝您的支持!這正是我所期待的。 – 2012-02-24 20:35:16