上下文缓存,即将一些常用的数据至于一个缓存集合中,当需要获取这些数据的时候,直接从缓存中读取,而不必每次都从数据库读取,以此提高效率。
其原理类似Apache Commons Collections 项目中LRUMap,LRUMap它继承于AbstractLinkedMap 抽象类,其基本思想是将最近使用的数据放置于双向链表的头上,进行淘汰时只需要删除链表最后一个即可。
继承关系如下图:
从AbstractHashedMap看起,分析AbstractLinkedMap和LURMap。
1、AbstractHashedMap
AbstractHashedMap实现了Map接口,并自己单独实现了Hash算法,使自己成为一个HashedMap。
API介绍如下所示,我只拣几个重要属性和方法介绍一下
http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/map/AbstractHashedMap.html
2、AbstractLinkedMap
AbstractLinkedMap继承自前面的AbstractHashedMap,在AbstractHashedMap的基础上,将所有的HashEntity维护成双向的链表
API地址如下:
http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/map/LinkedMap.html
3、LRUMap
LRUMap也是非线程安全。主要是在父类AbstractLinedMap的基础上,在更新双向链表的时候增加了moveToMRU/removeLRU操作
4、扩展
利用LRUMap实现上下文缓存,可以对原有的LRUMap进行的改造点
(1)重写了LRUMAP类,采用synchronized关键字实现了线程级别安全。
(2)增加了对缓存数据容量的控制,超过容量之后,从双向链表中将最后使用的Entity从链表中删除。
(3)缓存数据的更新,采用异步通知机制,一旦受到更新通知,将变更的数据从换从中清除
参考:
http://annegu.iteye.com/blog/539465
http://www.blogjava.net/xmatthew/archive/2012/06/28/380150.html