2012-04-14 40 views
22

Tôi hiện đang chơi với Redis và tôi có một vài câu hỏi. Có thể lấy các giá trị từ một mảng các khóa không?Nhận nhiều giá trị khóa từ Redis

Ví dụ:

users:1:name "daniel" 
users:1:age "24" 

users:2:name "user2" 
users:2:age "24" 

events:1:attendees "users:1", "users:2" 

Khi tôi redis.get events:1:attendees nó trả "users:1", "users:2". Tôi có thể lặp qua danh sách này và nhận được người dùng: 1, có được người dùng: 2. Nhưng điều này cảm thấy sai, là có một cách để có được tất cả các thông tin người tham dự trên 1 nhận được?!

Trong ray tôi sẽ làm một cái gì đó như thế này:

@event.attendees.each do |att| 
    att.name 
end 

Nhưng trong redis tôi không thể vì nó sẽ trả về các phím và không phải là đối tượng thực tế được lưu trữ tại khóa đó.

nhờ :)

Trả lời

38

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.

+0

Cảm ơn bạn đã trả lời! Tôi sẽ thử mã gợi ý của bạn! Cảm ơn :) –

+0

Cảm ơn @Didier, luôn luôn tốt để tìm hiểu những điều mới! –

5

Bạn có thể sử dụng lệnh Redis' EVAL để gửi cho nó một Lua script chạy một vòng lặp 'phía máy chủ' và trả lại kết quả trong một khối.

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