一、理解缓存的三个核心概念
Elements : JCS是一个对象缓存,能放置一些对象或是”elements”并通过key来访问它们,很像一个hashtable。可以想象JCS是一个能过Name来获取的hashtables的集合。
Regions : 每一个hashtables都被称做“region”,每一个region都能被独立于其他regions配置。例如,可以有一个称做城市的region,缓存了一些定期被改变的城市对象。可以定义一个region被叫做产品,缓存一些定期改变的产品数据。将可以配置易变的产品的regionelements 过期时间要快于city的region。
Auxiliaries : Auxiliaries是region能用的插件选项。核心的Auxiliaries是IndexedDisk Cache、TCPLateral Cache、RemoteCache Server。例如,磁盘缓存允许当内存达到阈值后把缓存对象交换到硬上。
JCS 通过cache.ccf文件配置系统属性具体如下:
# sets the default aux value for any non configured caches默认的
jcs.default=DC
jcs.default.cacheattributes=org.apache.commons.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1
jcs.default.cacheattributes.MemoryCacheName=org.apache.commons.jcs.engine.memory.lru.LRUMemoryCache
jcs.default.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.ShrinkerIntervalSeconds=60
jcs.default.elementattributes=org.apache.commons.jcs.engine.ElementAttributes
jcs.default.elementattributes.IsEternal=false
jcs.default.elementattributes.MaxLife=700
jcs.default.elementattributes.IdleTime=1800
jcs.default.elementattributes.IsSpool=true
jcs.default.elementattributes.IsRemote=true
jcs.default.elementattributes.IsLateral=true
# ################# 自定义testCache1缓存区配置#####################
# sets the default aux value for any non configured caches
jcs.region.testCache1= #加DC为添加辅助磁盘缓冲
jcs.region.testCache1.cacheattributes=org.apache.commons.jcs.engine.CompositeCacheAttributes # 设定使用的 cache 属性管理类别(复合型缓存)
jcs.region.testCache1.cacheattributes.MaxObjects=5 缓存最大存储数
jcs.region.testCache1.cacheattributes.MemoryCacheName=org.apache.commons.jcs.engine.memory.lru.LRUMemoryCache # 设定 memory cache 的算法,LRU(近期最少使用算法)会将内存页中近期不常用的对象移除内存
jcs.region.testCache1.cacheattributes.UseMemoryShrinker=true # 设定是否使用冗余内存清除程序
jcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=360
# 设定 shinker 执行时间间隔,会定期压缩缓存所占用内存
jcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=60
# 设定 element 属性类别
jcs.region.testCache1.elementattributes=org.apache.commons.jcs.engine.ElementAttributes
jcs.region.testCache1.elementattributes.IsEternal=false
# 设定缓存element最大生命周期,超过时间后去请求缓存对象则返回null
jcs.region.testCache1.elementattributes.MaxLife=700
# 设定缓存element可闲置的时间,需要配合设置IsEternal=false时才有效
jcs.region.testCache1.elementattributes.IdleTime=1800
jcs.region.testCache1.elementattributes.IsSpool=false
# 关闭远程缓存,默认为true
jcs.region.testCache1.elementattributes.IsRemote=false
# 关闭横向式的并行缓存,默认为true
jcs.auxiliary.DC.attributes=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=${user.dir}/jcs_swap ##磁盘文件目录thread_pool.remote_cache_client.startUpSize=4
二、应用方式
public static void testJCS()
throws Exception
{
CacheAccess<String, User> jcs = JCS.getInstance( "testCache1" );
for(int i=0;i<10;i++) {
String ii = Integer.toString(i);
User user = new User("ID"+ii, "name"+ii, "adress"+ii);
jcs.put( user.getID(), user );
jcs.get( "ID"+"0" );
jcs.get( "ID"+"1" );
}
System.out.println("---------------------");
Set set = jcs.getCacheControl().getKeySet();
Iterator it = set.iterator();
while(it.hasNext()) {
String key = (String)it.next();
User user=jcs.get( key );
System.out.println("ID="+user.getID()+"name="+user.getName());
}
}
三、源码解读:
进行初始化:concurrentHashmap进行存储,初始化双向链表,
1、put,形成链表节点,先添加到队列头,然后再添加到map里。
2、get,从map取到值节点后,把节点从链表移动到头部。
四、系统应用中,保持和数据库一致性方法。
1、数据查询时,先查询缓存,如果缓存没中,进行查询数据库后再把数据添加到缓存。
2、数据删除时,先删除缓存,再删除数据库。
3、数据修改时,先修改数据库,如果缓存中有数据,直接删除缓存待下次查询时自动注入缓存。
4、数据添加时,直接添加到数据库。不操作缓存。