Bạn đúng là chỉ có các cấu trúc dữ liệu đơn giản mới có sẵn với Redis và chúng không thể được cấu tạo theo giá trị (giống 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ẫu rất phổ biến.
Ví dụ, các mục chứa trong một tập hợp có thể là khóa cho các đối tượng khác (danh sách, bảng băm, các tập hợp khác, v.v.). Hãy thử áp dụng điều này vào ví dụ của bạn.
Để lập mô hình 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ỗi khách hàng sử dụng một bảng băm.
Đây là những 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
Khóa của các bản ghi này là c:ID
Hãy liên kết hai trong số chúng với một thiết bị và cổng:
sadd d:Los_Angeles:11 2 3
Chìa khóa của bộ này là d:device:port. Các tiền tố c:và d:chỉ là một quy ước. Một bộ cho mỗi thiết bị / cổng nên được tạo. Một khách hàng nhất định có thể thuộc nhiều nhóm (và do đó được liên kết với một số thiết bị / cổng).
Bây giờ để tìm khách hàng có phương thức giao hàng được gắn vào thiết bị / cổng này, chúng tôi chỉ cần truy xuất nội dung của bộ.
smembers d:Los_Angeles:11
1) "2"
2) "3"
thì thông tin khách hàng tương ứng có thể được truy xuất bằng cách kết hợp 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 sợ số lượng lệnh. Chúng rất nhanh và hầu hết các máy khách Redis đều có khả năng chuyển các truy vấn để chỉ cần một số vòng tua tối thiểu là cần thiết. Chỉ bằng cách sử dụng một máy đánh bóng và một vài nút bấm, vấn đề có thể được giải quyết chỉ với hai bước di chuyển.
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 vòng ở đâ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 bộ thiết bị / cổng và tìm nạp thông tin khách hàng tương ứng.
Ví dụ này rất nhỏ, nhưng nhìn chung, mặc dù bạn có thể biểu diễn các cấu trúc dữ liệu phức tạp với Redis, nhưng 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 và quyền truy cập dữ liệu (tức là tại thời điểm thiết kế, hãy tuân theo dữ liệu của bạn VÀ các trường hợp sử dụng của bạn).