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ę.
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ę.
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
Redis ma polecenie HMGET, które zwraca wartości kilku kluczy skrótu za pomocą jednego polecenia.
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
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
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
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"
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.
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
Jeśli Twoje pytanie zostało odebrane, proszę zaznaczyć właściwą odpowiedź. Dziękuję Ci. – kmerenkov