Pertanyaan Apakah ada analog MGET untuk hash Redis?


Saya berencana untuk mulai menggunakan hash insead kunci biasa. Tetapi saya tidak dapat menemukan informasi apa pun tentang multi get untuk hash-keys di Redis wiki. Apakah perintah semacam ini didukung oleh Redis?

Terima kasih.


32
2017-07-25 13:50


asal


Jawaban:


Anda dapat meminta hash atau kunci apa pun dalam jalur pipa, yaitu dalam satu permintaan ke instance redis Anda. Implementasi yang sebenarnya tergantung pada klien Anda, tetapi dengan redis-py itu akan terlihat seperti ini:

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

Klien akan mengeluarkan satu permintaan dengan 3 perintah. Ini adalah teknik yang sama yang digunakan untuk menambahkan beberapa nilai ke satu set sekaligus.

Baca lebih lanjut di http://redis.io/topics/pipelining


33
2018-02-08 00:42



Jika SORT membiarkan Anda menggunakan beberapa GET dengan -> sintaks, dan semua hash Anda memiliki bidang yang sama, Anda bisa mendapatkannya dalam jumlah besar dengan memasukkan nama mereka ke dalam satu set dan menyortirnya.

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

Tetapi sepertinya Anda tidak dapat melakukannya dengan akses hash. Plus Anda harus mengembalikan daftar kembali ke hash Anda sendiri.

UPDATE: Redis tampaknya membiarkan Anda mengambil beberapa bidang jika Anda memberi nama hash Anda dengan baik:

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"

6
2017-12-03 14:14



Tidak MHGETALL tetapi Anda dapat Lua:

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

return r

4
2018-03-11 10:14



Redis memiliki HMGET perintah, yang mengembalikan nilai dari beberapa kunci hash dengan satu perintah.


2
2017-08-09 21:57



Tidak ada perintah untuk melakukannya pada satu tembakan, tetapi ada cara untuk melakukannya "dengan baik", menggunakan daftar (atau set yang disortir) di mana Anda akan menyimpan hashKeys Anda, dan kemudian mengambilnya sebagai bulk menggunakan multi.

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

Saya sarankan menggunakan set yang diurutkan, di mana Anda menggunakan skor sebagai ID untuk hash Anda, itu memungkinkan untuk mengambil keuntungan dari semua nilai berdasarkan perintah.


0
2018-01-19 17:39