2010-07-25 27 views
29

我打算開始使用常規密鑰的散列密碼。但是我在Redis wiki中找不到有關多重獲取哈希鍵的任何信息。這種命令是否由Redis支持?有沒有用於Redis哈希的MGET模擬?

謝謝。

+0

如果您的問題得到解答,請註明正確的答案。謝謝。 – kmerenkov 2013-02-02 11:42:46

回答

31

您可以在一個請求給您的Redis實例查詢哈希值或在管道的任何按鍵,即。實際實現取決於您的客戶端上,但Redis的-PY它會是這樣的:

pipe = conn.pipeline() 
pipe.hgetall('foo') 
pipe.hgetall('bar') 
pipe.hgetall('zar') 
hash1, hash2, hash3 = pipe.execute() 

客戶端將發行3個命令一個請求。這與用於一次將多個值添加到集合的技術是相同的。

更多詳情http://redis.io/topics/pipelining

2

Redis的具有HMGET命令,該命令與一個命令返回幾個散列密鑰的值。

+1

啊,但是HMGET將返回混凝土領域的多個值,但我需要恢復整個哈希(如HGETALL DO http://code.google.com/p/redis/wiki/HgetallCommand)。無論如何,謝謝你的回答。 – Kirzilla 2010-08-10 10:59:04

+1

凹凸!整個哈希是什麼意思?有了'HMGET'您所查詢鍵的所有值,因爲你已經得到了鑰匙已經,並且每個按鍵都有以相應的值,你可以建立一個本地哈希與代碼中的每一個鍵/值對。請解釋。謝謝。 – Niloct 2011-11-26 00:34:46

+4

如果一個散列在概念上被用來容納一個用戶,那麼HMGET會給你例如帶有指定ID的單個用戶的用戶名和密碼。一個類似於MGET的等價方法可以在給定一組ID的情況下,一次性獲得所有這些用戶的用戶名和密碼。這是不同的。 – majelbstoat 2012-04-06 16:43:43

6

如果SORT讓你用多用的GET - >語法,和所有的哈希有相同的字段,你可以通過把他們的名字成爲一個集和排序是讓他們在散裝答覆。

SORT names_of_hashes GET *->field1 *->field2 *->field3 *->etc 

但它看起來並不像你可以用哈希訪問那樣做。另外你必須把返回列表變成哈希。

UPDATE:Redis的好像讓你獲取多個字段,如果你的名字你哈希很好:

redis> hset hash:1 name fish 
(integer) 1 
redis> hset hash:2 name donkey 
(integer) 1 
redis> hset hash:3 name horse 
(integer) 1 
redis> hset hash:1 type fish 
(integer) 1 
redis> hset hash:2 type mammal 
(integer) 1 
redis> hset hash:3 type mammal 
(integer) 1 
redis> sadd animals 1 
(integer) 1 
redis> sadd animals 2 
(integer) 1 
redis> sadd animals 3 
(integer) 1 
redis> sort animals get # get hash:*->name get hash:*->type 
1. "1" 
2. "fish" 
3. "fish" 
4. "2" 
5. "donkey" 
6. "mammal" 
7. "3" 
8. "horse" 
9. "mammal" 
0

沒有命令這樣做的一個鏡頭,但有一個辦法做到這一點「很好」 ,使用一個列表(或有序集合)來存儲你的hashKeys,然後使用multi將它們作爲批量檢索。

在PHP:

$redis->zAdd("myHashzSet", 1, "myHashKey:1"); 
$redis->zAdd("myHashzSet", 2, "myHashKey:2"); 
$redis->zAdd("myHashzSet", 3, "myHashKey:3"); 

$members = $redis->zRange("myHashzSet", 0, -1); 
$redis->multi(); 
foreach($members as $hashKey) { 
    $redis->hGetAll($hashKey); 
} 
$results = $redis->exec(); 

我使用有序集合,在您使用分數作爲您的哈希值的ID推薦,它可以採取一切得分基於命令的優勢。

3

沒有MHGETALL但你可以LUA它:

local r = {} 
for _, v in pairs(KEYS) do 
    r[#r+1] = redis.call('HGETALL', v) 
end 

return r