Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách lưu vào bộ đệm các đối tượng được tạo từ cơ sở dữ liệu MySQL

Có nhiều điều cần xem xét, nhưng nói chung, tôi sẽ đặt ánh xạ quan hệ cơ sở trong trường hợp của bạn trên Cổng dữ liệu hàng mẫu (RDG). Nếu bạn không có quá nhiều loại đối tượng khác nhau, thì phương pháp tiếp cận kiến ​​trúc này nên mở rộng quy mô đủ tốt. RDG sẽ tạo điều kiện thuận lợi cho việc triển khai bộ nhớ đệm của bạn nếu bạn giới hạn việc lưu giữ sổ bộ đệm trong lớp Finder.

Nếu bạn có thời gian và ý chí, hãy xem Mẫu kiến ​​trúc ứng dụng doanh nghiệp của Martin Fowler . Đó là một thông tin tốt.

Bây giờ đến các chi tiết cụ thể ...

  • xác định dữ liệu theo một số loại id

Thông thường, bạn sẽ sử dụng một số cột số nguyên tăng tự động trong cơ sở dữ liệu cho việc này. Bạn có thể sử dụng bản đồ không có thứ tự để kéo các đối tượng đó khỏi bộ nhớ cache một cách nhanh chóng. Vì bạn có tất cả các đối tượng trong bộ nhớ cache của mình, để tối ưu hóa, bạn cũng có thể triển khai một số find* chức năng tìm kiếm bộ nhớ cache đầu tiên. Bạn có thể sử dụng unardered_map / unardered_multimap để 'lập chỉ mục' một số dữ liệu, nếu thời gian tìm kiếm của bạn bị hạn chế nhiều, hoặc chỉ bám vào bản đồ / multimap cũ tốt. Tuy nhiên, điều này làm tăng gấp đôi công việc và bạn đã có nó miễn phí trong cơ sở dữ liệu các loại truy vấn này.

  • chỉnh sửa dữ liệu / đối tượng được lưu trong bộ nhớ cache

Dữ liệu bẩn sẽ không được hiển thị cho phần còn lại của hệ thống cho đến khi bạn thực sự ghi nó vào cơ sở dữ liệu. Khi bạn bắt đầu cập nhật và nếu mọi thứ diễn ra như dự định, bạn có thể thay thế đối tượng trong bộ nhớ cache bằng đối tượng bạn đã sử dụng để cập nhật hoặc chỉ cần xóa đối tượng trong bộ nhớ cache và cho phép người đọc khác lấy nó từ cơ sở dữ liệu (điều này sẽ dẫn đến trong bộ nhớ đệm đối tượng một lần nữa). Bạn có thể thực hiện điều này bằng cách sao chép đối tượng Gateway ban đầu, nhưng điểm mấu chốt là bạn nên triển khai một số chiến lược khóa.

  • xóa dữ liệu / đối tượng cũ và thêm dữ liệu / đối tượng mới

Ở đây bạn chỉ cần xóa đối tượng khỏi bộ nhớ cache và cố gắng xóa khỏi cơ sở dữ liệu. Nếu việc xóa không thành công trong cơ sở dữ liệu, các trình đọc khác sẽ lưu vào bộ nhớ cache. Chỉ cần đảm bảo rằng không có ứng dụng khách nào có thể truy cập vào cùng một bản ghi khi bạn đang trong quá trình xóa od. Khi thêm các bản ghi mới, bạn chỉ cần khởi tạo đối tượng Gateway, chuyển nó đến đối tượng cấp miền và khi bạn thực hiện xong các thay đổi, hãy gọi chèn trên đối tượng Gateway. Bạn có thể đặt đối tượng Gateway mới vào bộ đệm hoặc chỉ cần để trình đọc đầu tiên đưa nó vào bộ đệm.

  • sắp xếp dữ liệu theo một số loại ưu tiên (sử dụng lần cuối)
  • Cách tốt nhất để lưu vào bộ nhớ cache dữ liệu / đối tượng dựa trên thông tin được cung cấp VÀ TẠI SAO?

Đây là vấn đề chọn thuật toán bộ nhớ đệm tốt nhất. Đây không phải là một câu hỏi dễ trả lời, nhưng LRU sẽ hoạt động tốt. Không có số liệu thực tế, không có câu trả lời đúng, nhưng LRU rất dễ triển khai và nếu nó không phù hợp với yêu cầu của bạn, chỉ cần thực hiện các số liệu và quyết định một thuật toán mới. Đảm bảo rằng bạn có thể làm điều đó một cách liền mạch bằng cách có một giao diện tốt với bộ nhớ cache. Một điều khác cần lưu ý là các đối tượng cấp miền của bạn không bao giờ được phụ thuộc vào giới hạn bộ nhớ cache của bạn. Nếu bạn cần 100k đối tượng, nhưng bạn chỉ có 50k cache, bạn vẫn có tất cả 100k object trong bộ nhớ, nhưng 50k trong số chúng đang ở trong cache. Nói cách khác, các đối tượng của bạn không nên phụ thuộc vào trạng thái của bộ nhớ cache và cũng không nên quan tâm xem bạn có bộ nhớ đệm hay không.

Tiếp theo, nếu bạn vẫn còn mơ hồ với ý tưởng về RDG, bạn chỉ đơn giản là lưu đối tượng Gateway vào bộ nhớ đệm của mình. Bạn có thể giữ các phiên bản của đối tượng Gateway trong bộ nhớ cache của mình bằng shared_ptr, nhưng cũng nên xem xét chiến lược khóa (lạc quan so với bi quan), nếu bạn muốn tránh ghi bẩn. Ngoài ra, tất cả các Cổng của bạn (một cho mỗi bảng), có thể kế thừa cùng một giao diện, vì vậy bạn có thể tổng quát hóa các chiến lược lưu / tải của mình và bạn cũng có thể sử dụng một nhóm duy nhất trong khi giữ mọi thứ đơn giản. ( Xem boost ::pool. Có thể nó có thể giúp bạn triển khai bộ nhớ cache.)

Một điểm cuối cùng:

Bánh là một lời nói dối! :D Bất kể bạn quyết định làm gì, hãy đảm bảo rằng nó dựa trên một lượng lớn các chỉ số hiệu suất. Nếu bạn cải thiện hiệu suất lên 20% và bạn đã dành 2 tháng để làm điều đó, có lẽ bạn nên suy nghĩ về việc trang bị thêm một vài hợp đồng RAM cho phần cứng của mình. Tạo một số bằng chứng về khái niệm có thể kiểm chứng dễ dàng, điều này sẽ cung cấp cho bạn đủ thông tin cho dù việc triển khai bộ nhớ cache của bạn có thành công hay không, và nếu không, hãy thử một số giải pháp đã được thử nghiệm và đáng tin cậy sẵn có (memcached hoặc tương tự, như @Layne đã nhận xét).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để tối ưu hóa cơ sở dữ liệu truy vấn này trong cơ sở dữ liệu lớn?

  2. Tham số ràng buộc cho mệnh đề WHERE IN với PDO

  3. Kích hoạt trước khi xóa MySql

  4. Tạo bảng lập trình bằng MyBatis và MySql

  5. Tại sao kết quả từ một truy vấn SQL không trở lại theo thứ tự tôi mong đợi?