鉴于它是the hard things in computer science中的一个,有没有人知道设置可插入缓存策略的方法?
我正在考虑的是允许我编写一个程序,只需要很少考虑需要缓存的内容(使用某种锅炉板,低成本/无成本模式,可以在任何我想要的地方编译到任何地方缓存)然后当事情进一步发展时,我知道我需要缓存的地方,我可以在不进行侵入式代码更改的情况下添加它。
作为我正在寻找的那种解决方案的想法;我正在使用D programing language(但半途而废的C ++会好的)我喜欢模板。
答案 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()中创建缓存。