JCS缓存应用和源码解密

史绍晖
2023-12-01

一、理解缓存的三个核心概念

Elements : JCS是一个对象缓存,能放置一些对象或是”elements”并通过key来访问它们,很像一个hashtable。可以想象JCS是一个能过Name来获取的hashtables的集合。

Regions : 每一个hashtables都被称做“region”,每一个region都能被独立于其他regions配置。例如,可以有一个称做城市的region,缓存了一些定期被改变的城市对象。可以定义一个region被叫做产品,缓存一些定期改变的产品数据。将可以配置易变的产品的regionelements 过期时间要快于cityregion

Auxiliaries : Auxiliariesregion能用的插件选项。核心的AuxiliariesIndexedDisk CacheTCPLateral CacheRemoteCache 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 # 设定是否使用冗余内存清除程序

# 当有使用 memory shrinker 时,设定闲置内存的过期时间
#(就是超过这个时长时,根据缓存算法,超出MaxObjects(内对象的上限)的那部分对象将要被清除或者被存入磁盘中)

jcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=360

# 设定 shinker 执行时间间隔,会定期压缩缓存所占用内存

jcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=60

# 设定 element 属性类别

jcs.region.testCache1.elementattributes=org.apache.commons.jcs.engine.ElementAttributes

#UseMemoryShrinker 和 IsEternal 都是用来自动删除对象的。
#设定是否永久有效,默认为true

jcs.region.testCache1.elementattributes.IsEternal=false

# 设定缓存element最大生命周期,超过时间后去请求缓存对象则返回null

jcs.region.testCache1.elementattributes.MaxLife=700

# 设定缓存element可闲置的时间,需要配合设置IsEternal=false时才有效

jcs.region.testCache1.elementattributes.IdleTime=1800

#下面三个配置是开启辅助缓存的,如果在第一行没有设置辅助缓存,这里则是无效的。
#在第一行配置后,这里如果是false也是无效的,还是会进行一些辅助缓存的初始化操作等等,
#只是不会真正的生成缓存数据。
# 开启磁盘缓存,默认为true

jcs.region.testCache1.elementattributes.IsSpool=false

# 关闭远程缓存,默认为true

jcs.region.testCache1.elementattributes.IsRemote=false

# 关闭横向式的并行缓存,默认为true

jcs.region.testCache1.elementattributes.IsLateral=false


jcs.auxiliary.DC=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory 

jcs.auxiliary.DC.attributes=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes 

jcs.auxiliary.DC.attributes.DiskPath=${user.dir}/jcs_swap ##磁盘文件目录
jcs.auxiliary.DC.attributes.MaxPurgatorySize=10000000 
jcs.auxiliary.DC.attributes.MaxKeySize=1000000 
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=5000 
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000 
jcs.auxiliary.DC.attributes.ShutdownSpoolTimeLimit=60


# #############################################################
# ################# OPTIONAL THREAD POOL CONFIGURATION ###################
# Default thread pool config
thread_pool.default.boundarySize=2000
thread_pool.default.maximumPoolSize=150
thread_pool.default.minimumPoolSize=4
thread_pool.default.keepAliveTime=350000
# RUN ABORT WAIT BLOCK DISCARDOLDEST
thread_pool.default.whenBlockedPolicy=RUN
thread_pool.default.startUpSize=4


# Default Cache Event Queue thread pool config, used by auxiliaries
# since it doesn't use a boundary, some of the options are unnecessary
thread_pool.cache_event_queue.useBoundary=false
thread_pool.cache_event_queue.minimumPoolSize=5
thread_pool.cache_event_queue.keepAliveTime=3500
thread_pool.cache_event_queue.startUpSize=5


# Disk Cache pool
thread_pool.disk_cache_event_queue.useBoundary=false
thread_pool.remote_cache_client.maximumPoolSize=15
thread_pool.disk_cache_event_queue.minimumPoolSize=1
thread_pool.disk_cache_event_queue.keepAliveTime=3500
thread_pool.disk_cache_event_queue.startUpSize=1



# Remote cache client thread pool config
thread_pool.remote_cache_client.boundarySize=75
thread_pool.remote_cache_client.maximumPoolSize=150
thread_pool.remote_cache_client.minimumPoolSize=4
thread_pool.remote_cache_client.keepAliveTime=350000
thread_pool.remote_cache_client.whenBlockedPolicy=RUN

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、数据添加时,直接添加到数据库。不操作缓存。

 类似资料: