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。
我们希望更改缓存以将其缓存的对象存储到磁盘上...我们可以在策略中添加一些文件流吗?
感谢您的帮助!
答案 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()访问器,会更好;无论好坏,它都是允许的,你可以利用它
我们可以在策略中添加一些文件流吗?
直接向框架类添加功能意味着您的更改将被每个新版本覆盖,您将不得不重新应用更改。如上所示,最好定义自己的缓存,这样可以防止框架更改覆盖您的功能。