2010-07-25 20 views
29

Tôi đang lập kế hoạch để bắt đầu sử dụng băm bên trong các phím thông thường. Nhưng tôi không thể tìm thấy bất kỳ thông tin về đa nhận được cho hash-keys trong Redis wiki. Loại lệnh này có được Redis hỗ trợ không?Có tương tự MGET cho băm Redis không?

Cảm ơn bạn.

+0

Nếu câu hỏi của bạn đã được trả lời, hãy đánh dấu câu trả lời đúng. Cảm ơn bạn. – kmerenkov

Trả lời

31

Bạn có thể truy vấn băm hoặc bất kỳ khóa nào trong đường ống, tức là trong một yêu cầu đối với trường hợp của bạn. Triển khai thực tế tùy thuộc vào khách hàng của bạn, nhưng với redis-py nó sẽ trông như thế này:

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

Khách hàng sẽ phát hành một yêu cầu với 3 lệnh. Đây là kỹ thuật tương tự được sử dụng để thêm nhiều giá trị vào một tập hợp cùng một lúc.

Đọc thêm tại http://redis.io/topics/pipelining

2

Redis có lệnh HMGET, trả về giá trị của một số khóa băm bằng một lệnh.

+1

Vâng, nhưng HMGET sẽ trả lại nhiều giá trị của các trường cụ thể, nhưng tôi cần trả lại toàn bộ băm (như HGETALL làm http://code.google.com/p/redis/wiki/HgetallCommand). Dù sao, cảm ơn bạn đã trả lời của bạn. – Kirzilla

+1

Bump! Bạn có ý nghĩa gì bởi toàn bộ băm? Với 'HMGET', bạn có tất cả các giá trị cho các khóa được truy vấn và vì bạn đã có các khóa và mỗi khóa có giá trị tương ứng theo thứ tự, bạn có thể tạo một băm cục bộ với mỗi cặp khóa/giá trị trong mã của mình. Vui lòng giải thích. Cảm ơn bạn. – Niloct

+4

Nếu một băm được sử dụng một cách khái niệm để giữ một người dùng, thì HMGET sẽ lấy cho bạn ví dụ tên người dùng và mật khẩu của một người dùng với ID được chỉ định. Một phương pháp tương đương tương tự như MGET cho băm sẽ được cung cấp một bộ ID, nhận tên người dùng và mật khẩu của tất cả những người dùng đó, tất cả trong một lần. Đó là sự khác biệt. – majelbstoat

6

Nếu SORT cho phép bạn sử dụng nhiều GET bằng cú pháp -> và tất cả các băm của bạn có cùng các trường, bạn có thể nhận được chúng trong thư trả lời hàng loạt bằng cách đặt tên của chúng vào bộ và sắp xếp.

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

Nhưng có vẻ như bạn không thể làm điều đó với truy cập băm. Ngoài ra, bạn phải tự mình chuyển danh sách trả lại thành các băm.

UPDATE: Redis dường như cho phép bạn lấy nhiều lĩnh vực nếu bạn đặt tên băm của bạn độc đáo:

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

Không có lệnh để làm điều đó trên một shot, nhưng có một cách để làm điều đó "độc đáo" , bằng cách sử dụng một danh sách (hoặc tập hợp được sắp xếp), nơi bạn sẽ lưu trữ hashKeys của bạn, và sau đó lấy chúng dưới dạng hàng loạt bằng cách sử dụng đa.

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

Tôi recommand sử dụng một tập sắp xếp, nơi bạn sử dụng tỷ số như một ID cho hash của bạn, nó cho phép phát huy cao độ mọi lệnh điểm dựa.

3

Không MHGETALL nhưng bạn có thể Lua nó:

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

return r 
Các vấn đề liên quan