广义的可插入缓存模式?

时间:2010-04-27 16:21:45

标签: c++ design-patterns caching d

鉴于它是the hard things in computer science中的一个,有没有人知道设置可插入缓存策略的方法?

我正在考虑的是允许我编写一个程序,只需要很少考虑需要缓存的内容(使用某种锅炉板,低成本/无成本模式,可以在任何我想要的地方编译到任何地方缓存)然后当事情进一步发展时,我知道我需要缓存的地方,我可以在不进行侵入式代码更改的情况下添加它。

作为我正在寻找的那种解决方案的想法;我正在使用D programing language(但半途而废的C ++会好的)我喜欢模板。

4 个答案:

答案 0 :(得分:1)

最让我想到的是纯函数的记忆。 也许你也可能感兴趣的是这本书Pattern Oriented Software Architecture Patterns Management里面有缓存模式。

答案 1 :(得分:1)

有一个通用自动记忆的c ++ 0x解决方案(参见答案:What are reasonable ways to improve solving recursive problems?

答案 2 :(得分:0)

您可能对Drizzle如何使用不同的存储和缓存后端进行此类操作感兴趣。简而言之,它提供了一个接口,父应用程序可以使用它与MySQL,memcached等进行交互。

答案 3 :(得分:0)

我不确定解决方案必须在哪个范围内“通用”和“可插拔”,但如果你能负担重构缓存的使用(直接使用某些变量替换函数调用),那么请考虑以下内容:

//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();
}

如果要删除延迟初始化,则修改以便在构造函数和方法reset()中创建缓存。