缓存池的设计与使用
关键字:缓存管理、缓存池、缓存策略、缓存项、线程池
一、需求
在公司的门户支撑平台开发过程中使用简单的静态Map来缓存数据已经难以满足需求,需要对缓存的数据进行策略化的管理以及相应的界面维护操作。缓存数据可大致分为两种类型:
Ø 有键值的缓存数据,也就是缓存的数据项有一个唯一的标识值,类似门户结构、各种模板。
Ø 无键值的缓存数据,类似数据库连接池,线程池等。
以下为需求用例图:
二、目标
1) 用户可以快速访问频繁使用的数据
2) 将缓存中类型类似的对象进行组合(分池缓存)。
3) 提供可配置的缓存策略管理,以便可以通过界面操作而不是编码方式修改参数。
4) 提供可扩展的框架,以便以后可以转换到其它第三方的缓存API。(例如:ehcache)
5) 可以生成统计数据来监测缓存的效率,以及使用数据缓存后应用性能的提升效果。
三、设计核心类图
四、缓存策略维护
一般来说缓存策略配置文件需要在项目开发过程中使用到缓存时配置好,项目发布后还可在界面上维护策略信息(见图表一)。
Code:缓存池的唯一标识 (必须)
Name:缓存池的名称 (必须)
以下的可选:
poolCollectionClass:缓存池类型,IPool接口的某个实现类,目前提供了SimplePool,ObjectPool,ReusablePool,ThreadPool几种缓存池实现类。
poolClass:缓存池容器类。
PoolSize:缓存池阀值
Cyclelife:缓存项生命周期
InterruptTime:请求中断时间
Disabled:缓存池是否启用
Visible:是否在管理界面上显示
cacheLoader:缓存池加载器
arithmeticClass:缓存池算法器
五、界面操作
每个缓存策略对象左边树上的一个节点,双击可查看该缓存策略的详细配置,以及生成的缓存池中缓存情况。
右键点击缓存项,可以查看该缓存项内容或者刷新该缓存项。
图表 1
缓存策略中配置的生成多个缓存池统一由CachePoolManager 类管理。可以根据某个缓存策略的code值取到对应的缓存池。
如:IPool pool = CachePoolManager. getInstance().getCachePool(“portal_tree”)获取到的事门户的缓存池。
获取缓存项:
如果缓存项有唯一标识的值,例如已知门户对象key值为:12_41,则可通过如下获取:
CacheItem item = pool.getObject(“12_41”);
PortalNode portal = (PortalNode)item.getValue();
如果缓存池是类似数据库链接池,只需任意取出池中的某个元素即可,则可通过如下获取:
Cacheable item = pool.checkOut();
Connection conn = (Connection)item.getValue();
获取缓存项的时序图如下所示:
线程池的实现比较特殊,线程池中创建了一批工作线程,以及一个工作队列。如果工作队列中没有工作任务(工作队列为空),则池中所有的工作线程处于休眠等待状态。如果往工作队列中加入了工作任务,则工作队列会唤醒工作线程执行新加入的工作任务。任务执行完毕后工作线程重新进入休眠等待状态。
线程池单独实现了IThreadPool接口,该接口包含了两个方法:
/** * 执行一次性的非任务池中check-out的任务,一般都是临时new 出来的,执行完后不回收。 * @param o */ void excute(IAssignment task);
/** * 执行由任务池中check-out的任务缓存项,执行完后由任务池pool引用回收任务。 * @param pool * @param o */ void excute(IPool pool, Cacheable o); |
根据接口定义我们可以知道需要交给线程池中工作线程处理的任务都需要实现 IAssignment 接口。