你是正確的,只有簡單的數據結構可用於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表示複雜的數據結構,但它並不是立竿見影的。您需要在結構和數據訪問方面仔細思考模型(即在設計時,堅持使用您的數據和)。
你看過Redis哈希表嗎?例如,hmset/hmget可讓您將單個密鑰和多個可代表您身份的「字段」相關聯。 http://openmymind.net/2012/1/23/The-Little-Redis-Book/ - Redis Book有一些很好的例子。 – Alex 2012-02-24 06:26:33
我其實沒有看到HMSET/HMGET。在我經歷的教程後,它必定是一個新的增加。我會玩。 – 2012-02-24 16:25:20