Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Redis - Tập hợp đã sắp xếp, tìm mục theo giá trị thuộc tính

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Predis đang đưa ra 'Lỗi khi đọc dòng từ máy chủ'

  2. Giao tiếp giữa hai vùng chứa Docker trên macOS 10.12

  3. Stackexchange.Redis 'cháy và quên có đảm bảo giao hàng không?

  4. Cách xóa tất cả dữ liệu trong Redis

  5. Có cách nào để làm việc với các phiên mà không bị khóa trên trang ASP.Net MVC không?