2009-06-03 30 views
10

Tôi hiện đang trong quá trình xây dựng một kho lưu trữ cho một dự án mà sẽ DB chuyên sâu (kiểm tra hiệu suất đã được thực hiện và bộ nhớ đệm là cần thiết vì lý do tại sao tôi yêu cầu)Chiến lược Caching cho dữ liệu truy vấn

Các Tôi đã có nó thiết lập bây giờ là mỗi đối tượng được lưu trữ riêng, nếu tôi muốn làm một truy vấn cho họ đối tượng tôi vượt qua các truy vấn vào cơ sở dữ liệu và trả về một yêu cầu của id. (Đối với một số truy vấn đơn giản tôi đã lưu trong bộ nhớ cache và quản lý id)

Sau đó, tôi nhấn bộ nhớ cache với các id này và kéo chúng ra, bất kỳ đối tượng bị thiếu nào được gộp vào câu lệnh "where in" và được bắn vào cơ sở dữ liệu; tại thời điểm này tôi repopulate bộ nhớ cache với các id bị thiếu.

Truy vấn mà bản thân họ có nhiều khả năng là phân trang/sắp xếp dữ liệu.

Đây có phải là chiến lược phù hợp không? Hoặc có lẽ có những kỹ thuật tốt hơn?

Trả lời

9

Đây là một cách tiếp cận hợp lý và tôi đã đi tuyến đường này trước và tốt nhất là sử dụng điều này để lưu bộ nhớ đệm đơn giản.

Tuy nhiên, khi bạn cập nhật hoặc ghi vào cơ sở dữ liệu, bạn sẽ gặp phải một số vấn đề thú vị và bạn nên xử lý cẩn thận các tình huống này.

Ví dụ: dữ liệu bộ nhớ cache của bạn sẽ trở nên lỗi thời nếu người dùng cập nhật bản ghi trong cơ sở dữ liệu. Trong trường hợp đó, bạn sẽ cần đồng thời cập nhật bộ nhớ cache trong bộ nhớ hoặc xóa bộ đệm để nó có thể được làm mới trên truy vấn tìm nạp tiếp theo.

Mọi thứ cũng có thể phức tạp nếu bạn ví dụ người dùng cập nhật địa chỉ email của khách hàng trong một bảng riêng biệt nhưng được liên kết qua khóa ngoại.

Bên cạnh bộ đệm ẩn cơ sở dữ liệu, bạn cũng nên cân nhắc lưu vào bộ nhớ đệm đầu ra. Điều này hoạt động khá tốt nếu ví dụ bạn có bảng hiển thị dữ liệu bán hàng cho tháng trước. Bảng có thể được lưu trữ trong một tệp khác được đưa vào một loạt các trang khác muốn hiển thị bảng. Bây giờ nếu bạn lưu trữ tệp với bảng dữ liệu bán hàng, các trang khác khi họ yêu cầu tệp này, công cụ lưu vào bộ đệm ẩn có thể tìm nạp trực tiếp từ đĩa và lớp logic nghiệp vụ thậm chí không bị trúng. Điều này không áp dụng tất cả thời gian nhưng khá hữu ích cho các điều khiển tùy chỉnh.

Đơn vị Pattern làm việc

Nó cũng giúp để biết về mô hình Unit of Work.

Khi bạn kéo dữ liệu vào và ra khỏi một cơ sở dữ liệu, điều quan trọng là giữ theo dõi những gì bạn đã thay đổi; nếu không, dữ liệu đó sẽ không được ghi trở lại cơ sở dữ liệu. Tương tự, bạn phải chèn các đối tượng mới mà bạn tạo và xóa bất kỳ đối tượng nào bạn xóa.

Bạn có thể thay đổi cơ sở dữ liệu với mỗi thay đổi để mô hình đối tượng của bạn, nhưng này có thể dẫn đến rất nhiều rất nhỏ gọi cơ sở dữ liệu, mà kết thúc lên được rất chậm.Ngoài ra, nó yêu cầu bạn để mở giao dịch cho toàn bộ tương tác , là không thực tế nếu bạn có giao dịch kinh doanh trải rộng nhiều yêu cầu . Tình huống thậm chí còn tồi tệ hơn nếu bạn cần theo dõi các đối tượng bạn đã đọc để bạn có thể tránh số lần đọc không phù hợp .

Đơn vị công việc theo dõi mọi thứ bạn làm trong khi giao dịch có thể ảnh hưởng đến cơ sở dữ liệu . Khi bạn đã hoàn tất, nó sẽ hiển thị số mọi thứ cần được thực hiện để thay đổi cơ sở dữ liệu do kết quả của công việc của bạn là .

+1

Khi bất kỳ dữ liệu được cập nhật bộ nhớ cache được cập nhật - và nó cũng cập nhật bảng phạt. Tôi đã sử dụng mẫu kho lưu trữ trong dự án này và tất cả truy cập dữ liệu là thông qua độc quyền này. Kho lưu trữ nó tự luôn truy cập bộ nhớ cache sau đó db (nếu bộ nhớ cache trống hoặc dữ liệu đang được cập nhật) – TWith2Sugars

+0

Nếu bạn chưa có và nếu tùy chọn có sẵn cho bạn, tại sao không xem xét một ORM? – aleemb

1

Tôi không tư vấn chiến lược lưu bộ nhớ cache tùy chỉnh. Caching là khó khăn. Theo nền tảng lựa chọn của bạn, bạn có thể muốn chọn thư viện/công cụ lưu trong bộ nhớ đệm của bên thứ ba.

2

Nếu bạn đang sử dụng SQLServer, bạn có thể sử dụng SqlCacheDependency nơi bộ nhớ cache của bạn sẽ tự động được tái tạo khi bảng dữ liệu thay đổi trong cơ sở dữ liệu. Đây là liên kết cho SqlCacheDependency

Liên kết này chứa cache dependency solution tương tự. (Đó là cho một tập tin chứ không phải là một DB. Bạn sẽ cần phải thực hiện một số thay đổi theo các liên kết MSDN ở trên để có một sự phụ thuộc bộ nhớ cache trên DB)

Hope this helps :)

Các vấn đề liên quan