Thực hiện vòng lặp trên các mục và truy cập đồng bộ từng phần tử không hiệu quả lắm. Với Redis 2.4, có nhiều cách khác nhau để làm những gì bạn muốn:
- bằng cách sử dụng lệnh sort
- bằng cách sử dụng pipelining
- bằng cách sử dụng tham số variadic lệnh
với Redis 2.6, bạn cũng có thể sử dụng Lua scripting, nhưng điều này là không thực sự cần thiết ở đây.
Nhân tiện, cấu trúc dữ liệu bạn mô tả có thể được cải thiện bằng cách sử dụng băm. Thay vì lưu trữ dữ liệu người dùng trong các khóa riêng biệt, bạn có thể nhóm chúng trong một đối tượng băm.
Sử dụng lệnh sort
Bạn có thể sử dụng Redis loại lệnh để lấy dữ liệu trong một khứ hồi.
redis> set users:1:name "daniel"
OK
redis> set users:1:age 24
OK
redis> set users:2:name "user2"
OK
redis> set users:2:age 24
OK
redis> sadd events:1:attendees users:1 users:2
(integer) 2
redis> sort events:1:attendees by nosort get *:name get *:age
1) "user2"
2) "24"
3) "daniel"
4) "24"
Sử dụng pipelining
The Ruby hỗ trợ khách hàng pipelining (ví dụ: khả năng gửi nhiều truy vấn để Redis và chờ đợi trong vài trả lời).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
Mã trên sẽ chỉ lấy dữ liệu trong hai lần khứ hồi.
Sử dụng variadic lệnh tham số
Lệnh mget có thể được sử dụng để lấy một số dữ liệu trong một shot:
redis> smembers events:1:attendees
1) "users:2"
2) "users:1"
redis> mget users:1:name users:1:age users:2:name users:2:age
1) "daniel"
2) "24"
3) "user2"
4) "24"
Chi phí ở đây cũng là hai roundtrips. Điều này làm việc nếu bạn có thể đảm bảo rằng số lượng các phím để lấy được giới hạn. Nếu không, pipelining là một giải pháp tốt hơn nhiều.
Nguồn
2012-04-14 17:35:38
Cảm ơn bạn đã trả lời! Tôi sẽ thử mã gợi ý của bạn! Cảm ơn :) –
Cảm ơn @Didier, luôn luôn tốt để tìm hiểu những điều mới! –