Poco的LRUCacheStrategy - 它是如何运作的?

时间:2013-04-17 12:00:46

标签: c++ caching poco-libraries

    void onAdd(const void*, const KeyValueArgs <TKey, TValue>& args)
{
    _keys.push_front(args.key());
    std::pair<IndexIterator, bool> stat = _keyIndex.insert(std::make_pair(args.key(), _keys.begin()));
    if (!stat.second)
    {
        stat.first->second = _keys.begin();
    }
}

有人可以解释一下这段代码的工作原理吗?它来自POCO LRUCacheStrategy,它使用一张地图来实现LRUCache。

我们希望更改缓存以将其缓存的对象存储到磁盘上...我们可以在策略中添加一些文件流吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用this之类的序列化缓存地图,并使用fstream存储/读取它。

答案 1 :(得分:1)

  

我们希望更改缓存,以便在关闭

时将缓存的对象存储到磁盘

没有显式缓存close()(因此,没有策略onClose())调用,但您可以轻松创建自己的缓存(见下文)并自动化析构函数中的持久性(重要:确保防止逃避析构函数的任何例外)。

定义自己的缓存很简单,这是一个带有修改过的析构函数的LRUCache:

template <
    class TKey, 
    class TValue,
    class TMutex = FastMutex, 
    class TEventMutex = FastMutex
> 
class PersistentLRUCache: public Poco::AbstractCache<TKey, TValue, LRUStrategy<TKey, TValue>, TMutex, TEventMutex>
{
public:
    // ...

    ~PersistentLRUCache()
    {
            try {
                    Iterator it = _data.begin();
                    Iterator end = _data.end();
                    for (; it != end; ++it)
                    {
                        // write entries to file
                    }
            } catch (...) { /* log errors */}
    }

    // ...
};

访问父类(受保护)成员有点“脏”(如果框架提供了对底层容器的begin()和end()访问器,会更好;无论好坏,它都是允许的,你可以利用它

  

我们可以在策略中添加一些文件流吗?

直接向框架类添加功能意味着您的更改将被每个新版本覆盖,您将不得不重新应用更改。如上所示,最好定义自己的缓存,这样可以防止框架更改覆盖您的功能。