Bạn đúng rằng chỉ có cấu trúc dữ liệu đơn giản có sẵn với Redis và chúng không thể được tạo thành theo giá trị (như bạn có thể làm với cơ sở dữ liệu hướng tài liệu như CouchDB hoặc MongoDB). Tuy nhiên, có thể tạo cấu trúc dữ liệu bằng cách tham chiếu, và đây là một mô hình rất phổ biến.
Ví dụ, các mục có trong tập hợp có thể là các khóa cho các đối tượng khác (danh sách, bảng băm, các bộ khác, v.v ...). Hãy thử áp dụng điều này cho ví dụ của bạn.
Để mô hình hóa mối quan hệ giữa khách hàng và thiết bị + cổng, bạn có thể sử dụng các bộ chứa ID khách hàng. Để lưu trữ thông tin về khách hàng, một bảng băm cho mỗi khách hàng là tốt.
Sau đây là các khách hàng:
hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4
Các phím của những hồ sơ này là c: ID
Hãy sư hai người bọn họ đến một thiết bị và cổng:
sadd d:Los_Angeles:11 2 3
Mấu chốt của bộ này là d: device: port. Tiền tố c: và d: chỉ là một quy ước. Một bộ cho mỗi thiết bị/cổng sẽ được tạo. Một khách hàng nhất định có thể thuộc về một số bộ (và do đó liên quan đến một số thiết bị/cổng).
Bây giờ để tìm khách hàng có phương thức phân phối được gắn với thiết bị/cổng này, chúng tôi chỉ cần truy xuất nội dung của bộ này.
smembers d:Los_Angeles:11
1) "2"
2) "3"
sau đó thông tin khách hàng tương ứng có thể được lấy ra bởi pipelining một số lệnh hgetall:
hgetall c:2
hgetall c:3
1) "name"
2) "Jackson"
3) "protocol"
4) "udp"
5) "snmp_dest"
6) "127.0.0.1"
7) "syslog_dest"
8) "127.0.0.2"
1) "name"
2) "Davis"
3) "protocol"
4) "tcp"
5) "snmp_dest"
6) "127.0.0.3"
7) "syslog_dest"
8) "127.0.0.4"
Đừng ngại của số lệnh. Chúng rất nhanh và hầu hết các khách hàng Redis đều có khả năng phân phối các truy vấn để chỉ cần một số lượng tối thiểu các chuyến khứ hồi. Chỉ bằng cách sử dụng một smembers và một số hgetall, vấn đề có thể được giải quyết chỉ với hai vòng.
Bây giờ, có thể tối ưu hóa thêm một chút, nhờ vào lệnh SORT phổ biến. Đây có lẽ là lệnh phức tạp nhất trong Redis, và nó có thể được sử dụng để lưu một roundtrip tại đây.
sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest
1) "Jackson"
2) "udp"
3) "127.0.0.1"
4) "127.0.0.2"
5) "Davis"
6) "tcp"
7) "127.0.0.3"
8) "127.0.0.4"
Trong một lệnh, nó truy xuất nội dung của thiết bị/cổng và tìm thông tin khách hàng tương ứng.
Ví dụ này là tầm thường, nhưng nói chung, trong khi bạn có thể biểu diễn cấu trúc dữ liệu phức tạp với Redis, nó không phải là ngay lập tức. Bạn cần phải suy nghĩ cẩn thận về mô hình cả về cấu trúc lẫn quyền truy cập dữ liệu (tức là tại thời điểm thiết kế, dính vào dữ liệu của bạn VÀ trường hợp sử dụng của bạn).
Bạn đã xem Redis Hash chưa? Ví dụ hmset/hmget cho phép bạn kết hợp một khóa duy nhất và nhiều 'trường' có thể đại diện cho danh tính của bạn. http://openmymind.net/2012/1/23/The-Little-Redis-Book/ - Sách Redis có một số ví dụ hay. – Alex
Tôi thực sự KHÔNG thấy HMSET/HMGET. Nó phải là một bổ sung mới sau khi hướng dẫn tôi đã đi qua. Tôi sẽ chơi với điều đó. –