Tôi nghĩ nó rất đơn giản.
Giải pháp 1 (Kém hơn, không được khuyến nghị)
Theo cách của bạn về ZSCAN MySet 0 MATCH Id:92 count 1
không hoạt động vì chuỗi được lưu trữ là "{\"Id\":\"92\"...
không phải "{\"Id:92\"...
. Chuỗi đã được thay đổi thành một định dạng khác. Vì vậy, hãy thử sử dụng MATCH Id\":\"64
hoặc tương tự như vậy để khớp với dữ liệu tuần tự hóa json trong redis. Tôi không quen với json.net, vì vậy chuỗi thực tế để bạn khám phá.
Nhân tiện, tôi phải hỏi bạn đã làm ZSCAN MySet 0 MATCH Id:92 count 1
trả về một con trỏ? Tôi nghi ngờ bạn đã sử dụng ZSCAN
theo một cách sai lầm.
Giải pháp 2 (Tốt hơn, được khuyến khích mạnh mẽ)
ZSCAN
là tốt khi tập hợp được sắp xếp của bạn không lớn và bạn biết cách tiết kiệm thời gian vòng quanh mạng bằng giao dịch Lua của Redis. Điều này vẫn thực hiện thao tác "tra cứu theo ID" O (n). Do đó, giải pháp tốt hơn là thay đổi mô hình dữ liệu của bạn theo cách sau:
thay đổi tập hợp đã sắp xếp từ
# Score Value
0 1443476076 {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1 1443482969 {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}
đến
# Score Value
0 1443476076 Id:92
1 1443482969 Id:11
Di chuyển dữ liệu chi tiết còn lại trong một tập hợp khóa loại băm khác:
# Key field-value field-value ...
0 Id:92 Ref-7ADT DTime-1443476076 ...
1 Id:11 Ref-7ADT DTime-1443476076 ...
Sau đó, bạn định vị theo id bằng cách thực hiện hgetall id:92
. Đối với truy vấn có phạm vi theo ngày, bạn cần thực hiện ZRANGEBYSCORE sortedset mindate maxdate
sau đó hgetall
từng id một. Tốt hơn bạn nên sử dụng lua để gói các lệnh này thành một và nó vẫn sẽ rất nhanh!
Dữ liệu trong cơ sở dữ liệu NoSql cần được tổ chức theo cách dự phòng như trên. Điều này có thể làm cho một số hoạt động thông thường liên quan đến nhiều hơn một lệnh và vòng lặp, nhưng nó có thể được giải quyết bằng tính năng lua của redis. Tôi thực sự khuyên bạn nên sử dụng tính năng lua của redis, vì nó gói các lệnh thành một vòng mạng, tất cả đều được thực thi ở phía redis-server và là nguyên tử và siêu nhanh!
Trả lời nếu có điều gì bạn không biết