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

ServiceStack.Net Redis:Lưu trữ các đối tượng liên quan so với id đối tượng liên quan

Thay vì băm lại rất nhiều tài liệu khác ngoài tự nhiên, tôi sẽ liệt kê một vài tài liệu xung quanh để biết một số thông tin cơ bản về Ứng dụng khách Redis của Redis + ServiceStack:

  • Những điều cần suy nghĩ khi thiết kế một ứng dụng NoSQL Redis
  • Thiết kế Cơ sở dữ liệu NoSQL bằng Redis
  • Tổng quan chung về Redis và .NET
  • Lập phiên bản không thao tác và Di chuyển dữ liệu với Ứng dụng khách C # Redis

Không có ma thuật - Redis là một bức tranh trống

Đầu tiên, tôi muốn chỉ ra rằng việc sử dụng Redis làm kho lưu trữ dữ liệu chỉ cung cấp một khung trống và không có bất kỳ khái niệm nào về các thực thể liên quan. tức là nó chỉ cung cấp quyền truy cập vào cấu trúc dữ liệu comp-sci phân tán. Cách các mối quan hệ được lưu trữ cuối cùng phụ thuộc vào trình điều khiển máy khách (tức là Máy khách ServiceStack C # Redis) hoặc nhà phát triển ứng dụng, bằng cách sử dụng các hoạt động cấu trúc dữ liệu ban đầu của Redis. Vì tất cả các cấu trúc dữ liệu chính đều được triển khai trong Redis, về cơ bản bạn hoàn toàn có quyền tự do về cách bạn muốn cấu trúc và lưu trữ dữ liệu của mình.

Hãy nghĩ cách bạn sẽ cấu trúc các mối quan hệ trong mã

Vì vậy, cách tốt nhất để nghĩ về cách lưu trữ nội dung trong Redis, là hoàn toàn không quan tâm đến cách dữ liệu được lưu trữ trong bảng RDBMS và nghĩ về cách nó được lưu trữ trong mã của bạn, tức là sử dụng các lớp thu thập C # tích hợp sẵn trong bộ nhớ - Redis phản ánh hành vi nào với cấu trúc dữ liệu phía máy chủ của họ.

Mặc dù không có khái niệm về các thực thể liên quan, nhưng Set tích hợp sẵn của Redis và SortedSet cấu trúc dữ liệu cung cấp cách lý tưởng để lưu trữ các chỉ mục. Ví dụ. Bộ của Redis bộ sưu tập chỉ lưu trữ tối đa 1 lần xuất hiện của một phần tử. Điều này có nghĩa là bạn có thể thêm các mục / khóa / id vào nó một cách an toàn và không cần quan tâm đến việc mục đó đã tồn tại hay chưa vì kết quả cuối cùng sẽ giống như bạn đã gọi nó 1 hoặc 100 lần - tức là nó không có giá trị và cuối cùng chỉ có 1 phần tử được lưu trữ trong bộ. Vì vậy, một trường hợp sử dụng phổ biến là khi lưu trữ một biểu đồ đối tượng (gốc tổng hợp) là lưu trữ Id thực thể con (hay còn gọi là Khóa ngoại) vào một Tập hợp mỗi khi bạn lưu mô hình.

Trực quan hóa dữ liệu của bạn

Để có hình dung tốt về cách các Thực thể được lưu trữ trong Redis, tôi khuyên bạn nên cài đặt Giao diện người dùng quản trị Redis hoạt động tốt với Ứng dụng khách C # Redis của ServiceStack vì nó sử dụng quy ước đặt tên khóa bên dưới để cung cấp chế độ xem phân cấp đẹp mắt, nhóm các thực thể đã nhập của bạn lại với nhau (bất chấp tất cả các khóa tồn tại trong cùng một không gian khóa chung).

Để xem và chỉnh sửa một Đối tượng, hãy nhấp vào nút Chỉnh sửa liên kết để xem và sửa đổi đại diện JSON nội bộ của thực thể đã chọn. Hy vọng rằng bạn sẽ có thể đưa ra quyết định tốt hơn về cách thiết kế các mô hình của mình sau khi bạn có thể thấy cách chúng được lưu trữ.

Cách POCO / Thực thể được lưu trữ

Ứng dụng khách C # Redis hoạt động với bất kỳ POCO nào có một khóa chính duy nhất - theo mặc định, khóa này được mong đợi là Id (mặc dù quy ước này có thể được ghi đè với ModelConfig). Các POCO thông thường được lưu trữ vào Redis dưới dạng JSON được tuần tự hóa với cả typeof(Poco).NameId được sử dụng để tạo một khóa duy nhất cho trường hợp đó. Ví dụ:

urn:Poco:{Id} => '{"Id":1,"Foo":"Bar"}'

POCO trong C # Client thường được tuần tự hóa bằng cách sử dụng Bộ nối tiếp nhanh Json của ServiceStack trong đó chỉ các thuộc tính có bộ thu công khai mới được tuần tự hóa (và bộ định kỳ công khai để gỡ tuần tự trở lại).

Có thể ghi đè các giá trị mặc định với [DataMember] nhưng không được khuyến nghị vì nó làm xấu POCO của bạn.

Các thực thể bị đốm màu

Vì vậy, biết rằng POCO trong Redis chỉ là blobbed, bạn chỉ muốn giữ dữ liệu gốc không tổng hợp trên POCO của mình dưới dạng thuộc tính công khai (trừ khi bạn cố tình muốn lưu trữ dữ liệu dư thừa). Một quy ước tốt là sử dụng các phương thức để tìm nạp dữ liệu liên quan (vì nó sẽ không được tuần tự hóa) nhưng cũng cho ứng dụng của bạn biết phương thức nào thực hiện lệnh gọi từ xa để đọc dữ liệu.

Vì vậy, câu hỏi về việc liệu Nguồn cấp dữ liệu sẽ được lưu trữ với Người dùng đó có phải là dữ liệu gốc không tổng hợp hay không, tức là bạn có muốn truy cập nguồn cấp dữ liệu của người dùng bên ngoài ngữ cảnh của người dùng hay không? Nếu không, hãy để lại List<Feed> Feeds thuộc tính trên User loại.

Duy trì Chỉ mục Tùy chỉnh

Tuy nhiên, nếu bạn muốn giữ tất cả các nguồn cấp dữ liệu có thể truy cập độc lập, tức là với redisFeeds.GetById(1) thì bạn sẽ muốn lưu trữ nó bên ngoài người dùng và duy trì một chỉ mục liên kết 2 thực thể.

Như bạn đã nhận thấy, có nhiều cách để lưu trữ mối quan hệ giữa các thực thể và cách bạn làm như vậy phần lớn là do sở thích. Đối với thực thể con trong cha mẹ> con mối quan hệ mà bạn luôn muốn lưu trữ ParentId với thực thể con. Đối với Cấp độ gốc, bạn có thể chọn lưu trữ một bộ sưu tập ID con với mô hình và sau đó thực hiện một lần tìm nạp duy nhất cho tất cả các thực thể con để điều chỉnh lại mô hình.

Một cách khác là duy trì chỉ mục bên ngoài dto mẹ trong Bộ của riêng nó cho mỗi phiên bản gốc. Một số ví dụ điển hình về điều này là trong Mã nguồn C # của bản demo Redis StackOverflow nơi mối quan hệ của Users > QuestionsUsers > Answers được lưu trữ trong:

idx:user>q:{UserId} => [{QuestionId1},{QuestionId2},etc]
idx:user>a:{UserId} => [{AnswerId1},{AnswerId2},etc]

Mặc dù C # RedisClient bao gồm hỗ trợ cho quy ước Parent / Child mặc định thông qua TParent.StoreRelatedEntities (), TParent.GetRelatedEntities<TChild>()TParent.DeleteRelatedEntities() Các API nơi một chỉ mục được duy trì phía sau cảnh trông giống như sau:

ref:Question/Answer:{QuestionId} => [{answerIds},..]

Thực tế, đây chỉ là một số lựa chọn khả thi của bạn, trong đó có nhiều cách khác nhau để đạt được cùng một kết quả và trong đó bạn cũng có quyền tự do để hoàn thành công việc của mình.

Các quyền tự do đánh máy lỏng lẻo, ít lược đồ của NoSQL nên được chấp nhận và bạn không nên lo lắng về việc cố gắng tuân theo một cấu trúc cứng nhắc, được xác định trước mà bạn có thể quen thuộc khi sử dụng RDBMS.

Tóm lại, không có cách đúng nào thực sự để lưu trữ dữ liệu trong Redis, ví dụ:Ứng dụng khách C # Redis đưa ra một số giả định để cung cấp API cấp cao xung quanh các POCO và nó làm mờ các POCO trong các giá trị chuỗi an toàn nhị phân của Redis - mặc dù có những khách hàng khác sẽ thích lưu trữ các thuộc tính thực thể trong Redis Hashes (Từ điển) thay thế . Cả hai đều sẽ hoạt động.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Thiết lập Redis trên Web hài lòng

  2. Lập chỉ mục bằng cách sử dụng các bộ được sắp xếp của Redis

  3. node.js lưu trữ các đối tượng trong redis

  4. Bế tắc khi sử dụng Aggregator + Redis

  5. Làm thế nào để đạt được cùng thứ hạng với cùng số điểm trong Redis 'ZRANK?