Tôi nghĩ lời khuyên tốt nhất là tránh dính vào mô hình quan hệ khi chuyển một thứ gì đó từ RDBMS sang Redis. Và ngoài mô hình, một điểm khác biệt quan trọng là tập trung vào các đường dẫn truy cập dữ liệu cũng như cấu trúc dữ liệu.
Redis không bao gồm một ngôn ngữ truy vấn (mà là lệnh la memcached), và do đó không thể trả lời các truy vấn tùy ý. Nếu đường dẫn truy cập đến dữ liệu không phải là một phần của cấu trúc dữ liệu, thì dữ liệu đó không thể được truy xuất một cách hiệu quả.
Redis không phải là cửa hàng NoSQL tốt nhất khi hỗ trợ các truy vấn tùy ý. Ví dụ:bạn sẽ được phục vụ tốt hơn bởi một cái gì đó như MongoDB.
Bây giờ, nếu bạn thực sự muốn triển khai nội dung của mình với Redis, bạn có thể thử sử dụng một chiến lược tương tự như công cụ gắn thẻ. Bản ghi của bạn có thể được lưu trữ trong các đối tượng băm. Đối với mỗi phần cột của các truy vấn tùy ý mà bạn cần hỗ trợ, bạn tạo chỉ mục ngược bằng cách sử dụng các bộ.
Ví dụ:
# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior
# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5
# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"
Bằng cách kết hợp liên hiệp, giao điểm, sự khác biệt, các truy vấn phức tạp hơn có thể được thực hiện. Đối với các giá trị không rời rạc hoặc đối với các truy vấn dựa trên phạm vi, phải sử dụng các bộ có thứ tự (zset) (và có thể được kết hợp với các bộ bình thường).
Phương pháp này thường khá nhanh nếu các giá trị đủ phân biệt. Xin lưu ý rằng bạn không có tính linh hoạt của RDBMS (không có biểu thức chính quy, không có tìm kiếm tiền tố, truy vấn phạm vi là một vấn đề khó giải quyết, v.v.)