2010-04-27 23 views
8

Vì đó là một trong số the hard things in computer science, có ai biết cách thiết lập chiến lược bộ nhớ đệm có thể cắm được không?Mô hình bộ đệm ẩn có thể cắm được?

Những gì tôi đang nghĩ sẽ cho phép tôi viết một chương trình với suy nghĩ tối thiểu về những gì cần được lưu trữ (ei sử dụng một số loại nồi hơi, mẫu thấp/không có chi phí. muốn bộ nhớ đệm) và sau đó khi mọi thứ được tiếp tục và tôi biết nơi tôi cần bộ nhớ đệm, tôi có thể thêm nó vào mà không thực hiện thay đổi mã xâm lấn.

Là một ý tưởng cho loại giải pháp mà tôi đang tìm kiếm; Tôi đang làm việc với các D programing language (nhưng nửa chừng C++ sẽ là tốt) và tôi thích mẫu.

+1

Caching loại sự vật nào? Ở đâu? Khi nó đứng, câu hỏi không có ý nghĩa. –

+0

Câu hỏi có ý nghĩa hoàn hảo với tôi, Neil. Có lẽ điều này nên được gắn thẻ là "lập trình chung"? –

+1

@Neil. * Caching giá trị trả về của một hàm * Bên cạnh đó làm cho không có giả định: Nó có thể là một hàm thuần túy, nó có thể không. Nó có thể tải dữ liệu từ một DB hoặc một trang web, hoặc chỉ từ đĩa cục bộ hoặc chỉ cần tính toán nó trên bay. Nó thậm chí có thể là một cái gì đó mà không thể được lưu trữ (cách duy nhất để biết nếu giá trị là cũ là để có được giá trị một lần nữa) hay không. Một giải pháp phải có khả năng đối phó với bất kỳ và tất cả các điều trên ở bất kỳ kết hợp nào. – BCS

Trả lời

0

Bạn có thể quan tâm đến cách Drizzle thực hiện loại điều này với các bộ lưu trữ khác nhau và bộ nhớ đệm phụ trợ. Tóm lại, nó cung cấp một giao diện có thể được ứng dụng cha mẹ sử dụng để tương tác với MySQL, memcached, v.v.

+0

Điều đó có thể quan tâm, nhưng tôi đã suy nghĩ nhiều hơn dọc theo các dòng bên trong một ứng dụng. – BCS

0

Tôi không chắc giải pháp nào phải được "khái quát" và "có thể cắm" được, nhưng nếu bạn có thể đủ khả năng sắp xếp của việc sử dụng của bộ nhớ đệm của bạn (chức năng thay thế các cuộc gọi với sử dụng trực tiếp của một số biến), sau đó xem xét như sau:

//works for any CopyConstructible type of cache and any function 
//which result should be cached 
//(the arguments of the function have to be properly binded) 
/** 
* caching + lazy initialization 
* we shouldn't allow copying of lazy<T>, because every copy initializes its own cache 
* and this is not what intended most of the time 
* T must be CopyConstructible 
*/ 
template<class T> 
class lazy: private boost::noncopyable 
{ 
public: 
    lazy(boost::function0<T> _creator) 
     : creator(_creator) {} 
    /** 
    * aka is_cashed 
    */ 
    bool is_initialized() 
    { 
     return val; 
    } 
    operator T&() 
    { 
     if(!val) 
      val = creator(); 
     return *val; 
    } 
    T& operator*() 
    { 
     if(!val) 
      val = creator(); 
     return *val; 
    } 
    /** 
    * resets cache to update it next time it is used 
    */ 
    void reset() 
    { 
     val.reset(); 
    } 
private: 
    boost::function0<T> creator; 
    boost::optional<T> val; 
}; 
//usage 
    //initialize caching and updating strategy 
    lazy<WebPage> cached_page(boost::bind(&Server::getPage, server)); 
    server->OnPageUpdate = boost::bind(&OnPageUpdate, cached_page); 
    ..... 

    //use cached_page everywhere as if it were regular variable of WebPage type 
    showPage(cached_page); 
//-------------- 
void OnPageUpdate(lazy<WebPage>& page) 
{ 
    page.reset(); 
} 

Nếu bạn muốn loại bỏ khởi lười biếng, sau đó sửa đổi sao cho bộ nhớ cache được tạo ra trong hàm tạo và phương thức reset().

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