读书人

POCO C++库学习跟分析 - Cache

发布时间: 2013-03-28 10:20:24 作者: rapoo

POCO C++库学习和分析 -- Cache
POCO C++库学习和分析 -- Cache

1. Cache概述 在STL::map或者STL::set中,容器的尺寸是没有上限的,数目可以不断的扩充。并且在STL的容器中,元素是不会自动过期的,除非显式的被删除。Poco的Cache可以被看成是STL中容器的一个扩充,容器中的元素会自动过期(即失效)。在Poco实现的Cache框架中,基础的过期策略有两种。一种是LRU(Last Recent Used),另外一种是基于时间的过期(Time based expiration)。在上述两种过期策略之上,还提供了两者之间的混合。

下面是相关的类:
1. LRUCache: 最近使用Cache。在内部维护一个Cache的最大容量M,始终只保存M个元素于Cache内部,当第M+1元素插入Cache中时,最先被放入Cache中的元素将失效。
2. ExpireCache: 时间过期Cache。在内部统一管理失效时间T,当元素插入Cache后,超过时间T,则删除。
3. AccessExpireCache: 时间过期Cache。同ExpireCache不同的是,当元素被访问后,重新开始计算该元素的超时时间,而不是只从元素插入时开始计时。
4. UniqueExpireCache: 时间过期Cache。同ExpireCache不同的是,每一个元素都有自己单独的失效时间。
5. UniqueAccessExpireCache:时间过期Cache。同AccessExpireCache不同的是,每一个元素都有自己单独的失效时间。
6. ExpireLRUCache:时间过期和LRU策略的混合体。当时间过期和LRU任一过期条件被触发时,容器中的元素失效。
7. AccessExpireLRUCache:时间过期和LRU策略的混合体。同ExpireLRUCache相比,当元素被访问后,重新开始计算该元素的超时时间,而不是只从元素插入时开始计时。
8. UniqueExpireLRUCache:时间过期和LRU策略的混合体。同ExpireLRUCache相比,每一个元素都有自己单独的失效时间。
9. UniqueAccessExpireLRUCache:时间过期和LRU策略的混合体。同UniqueExpireLRUCache相比,当元素被访问后,重新开始计算该元素的超时时间,而不是只从元素插入时开始计时。



2. Cache的内部结构2.1 Cache类 下面是Poco中Cache的类图:

POCO C++库学习跟分析 - Cache
从类图中我们可以看到所有的Cache都有一个对应的strategy类。事实上strategy类负责快速搜索Cache中的过期元素。Cache和strategy采用了Poco中的同步事件机制(POCO C++库学习和分析 -- 通知和事件 (四) )。


让我们来看AbstractCache的定义:
#include "Poco/LRUCache.h"int main(){Poco::LRUCache<int, std::string> myCache(3);myCache.add(1, "Lousy"); // |-1-| -> first elem is the most popular onePoco::SharedPtr<std::string> ptrElem = myCache.get(1); // |-1-|myCache.add(2, "Morning"); // |-2-1-|myCache.add(3, "USA"); // |-3-2-1-|// now get rid of the most unpopular entry: "Lousy"myCache.add(4, "Good"); // |-4-3-2-|poco_assert (*ptrElem == "Lousy"); // content of ptrElem is still validptrElem = myCache.get(2); // |-2-4-3-|// replace the morning entry with eveningmyCache.add(2, "Evening"); // 2 Events: Remove followed by Add}

(版权所有,转载时请注明作者和出处 http://blog.csdn.net/arau_sh/article/details/8698434)

读书人网 >C++

热点推荐