1
    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。

我们想更改缓存以在关闭时将其缓存对象存储到磁盘...我们可以在策略中添加一些文件流吗?

感谢您的帮助!

4

2 回答 2

1

使用类似这样的东西序列化缓存映射并使用 fstream 存储/读取它。

于 2013-04-18T06:12:08.913 回答
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() 访问器会更好;无论好坏,它都是允许的,您可以利用它。

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

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

于 2013-04-21T17:34:57.253 回答