Thực hiện một 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 để thực hiện những gì bạn muốn:
- bằng cách sử dụng lệnh sắp xếp
- bằng cách sử dụng pipelining
- bằng cách sử dụng các lệnh tham số khác nhau
Với Redis 2.6, bạn cũng có thể sử dụng Lua scripting, nhưng điều này không thực sự bắt buộc ở đâ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 hàm 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 sắp xếp
Bạn có thể sử dụng lệnh sắp xếp Redis để truy xuất dữ liệu trong một vòng.
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
Ứng dụng khách Ruby hỗ trợ pipelining (tức là khả năng gửi một số truy vấn tới Redis và đợi một vài câu 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
Đoạn mã trên sẽ chỉ truy xuất dữ liệu trong hai vòng lặp.
Sử dụng lệnh tham số đa dạng
Lệnh MGET có thể được sử dụng để truy xuất một số dữ liệu trong một lần chụp:
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 khứ hồi. Điều này hoạt động nếu bạn có thể đảm bảo rằng số lượng khóa để lấy là có giới hạn. Nếu không, pipelining là một giải pháp tốt hơn nhiều.