2010-07-25 13 views
29

Mam zamiar zacząć używać skrótów zwykłych kluczy. Ale nie mogę znaleźć żadnych informacji na temat multi get for hash-keys w wiki Redis. Czy tego rodzaju polecenia są obsługiwane przez Redis?Czy istnieje analog MGET dla skrótów Redisa?

Dziękuję.

+0

Jeśli Twoje pytanie zostało odebrane, proszę zaznaczyć właściwą odpowiedź. Dziękuję Ci. – kmerenkov

Odpowiedz

31

Można wyszukiwać hashy lub dowolne klucze w potoku, tj. W jednym żądaniu do instancji redis. Faktyczna realizacja zależy od klienta, ale z Redis-Py że to wyglądać tak:

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

Klient wyda jeden wniosek z 3 komend. Jest to ta sama technika, która jest używana do jednoczesnego dodawania wielu wartości do zestawu.

Czytaj więcej na http://redis.io/topics/pipelining

2

Redis ma polecenie HMGET, które zwraca wartości kilku kluczy skrótu za pomocą jednego polecenia.

+1

Tak, ale HMGET zwróci wiele wartości konkretnych pól, ale potrzebuję zwrócić całe hashe (jak HGETALL do http://code.google.com/p/redis/wiki/HgetallCommand). W każdym razie, dziękuję za odpowiedź. – Kirzilla

+1

Bump! Co masz na myśli przez całe hashe? Używając 'HMGET', masz wszystkie wartości dla zapytanych kluczy, a ponieważ masz już klucze, a każdy klucz ma odpowiednią wartość w kolejności, możesz utworzyć lokalny skrót z każdą parą klucz/wartość w kodzie. Proszę wytłumacz. Dziękuję Ci. – Niloct

+4

Jeśli hash jest konceptualnie używany do przechowywania użytkownika, HMGET otrzyma na przykład nazwę użytkownika i hasło pojedynczego użytkownika o podanym ID. Odpowiednia metoda analogiczna do MGET dla skrótów, przy założeniu zestawu identyfikatorów, dostanie nazwy użytkowników i hasła wszystkich tych użytkowników, wszystko za jednym zamachem. Taka jest różnica. – majelbstoat

6

Jeśli SORTUJ użyjesz wielu GET-ów ze składnią ->, a wszystkie twoje hasze mają te same pola, możesz je uzyskać w zbiorczej odpowiedzi, umieszczając ich nazwy w zestawie i sortując.

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

Ale wygląda na to, że nie można tego zrobić za pomocą hasha. Poza tym trzeba by samemu zamienić listę zwrotów na hashe.

UPDATE: Redis wydaje pozwala pobierać wiele pól, jeśli wymienić swoje mieszań ładnie:

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

Nie ma polecenie, aby to zrobić na jeden strzał, ale istnieje sposób, aby to zrobić „dobrze” , używając listy (lub sortowanego zestawu), w której przechowywałbyś hashKeys, a następnie pobierał je jako zbiorcze używając wielu.

W 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(); 

polecam użyciu posortowaną zestaw, gdzie użyć wynik jako identyfikatorem hash, pozwala skorzystać z zalet polecenia zdobyć opartej wszystkich.

3

Nie MHGETALL ale można go Lua:

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

return r