对于JCS索引磁盘备用缓存是一个可选的插件,它主要的目的提供一个二级缓存,从而降低缓存对内存的压力。当内存缓存超出了最大值时,缓存处理会检查看是否为存储区配置了”disk”类型的备用缓存,如果使用了被索引的磁盘备用缓存,缓存中心会把从内存中删除的缓存项目保存到磁盘。
磁盘索引
被索引的磁盘备用缓存(The Indexed Disk Auxiliary Cache)是磁盘缓存的最快模式。项目被保存在用于缓存区文件的末尾,每个磁盘项目的第一个字节指定实体的长度,保存在内存中文件的开始位置引用了项目的键(key)。尽管这样依然需要内存开销,但是相对性能的提高,这些开销几乎微不足道。根据键(key)的大小,50万个磁盘实体仅可能需要大约3MB的内存。定位一个项目的位置像map的查找一样快,并且只需要2次磁盘访问。
在项目从磁盘缓存中删除时,存储文件上的有效存储区的位置被记录在一个排序的优化数组中,这个数组的大小不超过内存中允许的键(key)的最大数量。这样就允许磁盘缓存重用空白区域,因此保持了文件大小的最小化。
炼狱(Purgatory)
磁盘缓存的写处理是异步,并且通过使用一个叫做炼狱(purgatory)内存区域来提高效率。获取项目时,先检查炼狱(purgatory)然后检查磁盘。在项目被发送到purgatory的同时,也被放到了磁盘队列中。如果从purgatory中取得了一个项目,那么这个项目将不再被写到磁盘上,因为缓存中心会把它移动到内存中。使用purgatory确保了不需要等待磁盘的写处理,也避免了必要的项目边界的写处理,并且项目总是有效的。
持久化(Persistence)
在磁盘缓存正确关闭的时候,内存索引被写入磁盘并且值文件是被整理过的。当缓存启动的时候,磁盘缓存根据配置来读取或删除这个索引文件,这样提供了一个不可靠的持久化机制。
配置(Configuration)
配置方法很简单,在cache.cff配置文件的备用缓存段中就可以做到。在下面的例子中,创建了一个被DC引用的磁盘备用缓存,它使用的文件放在”DiskPath”目录中。
磁盘索引采用了LRU存储限定,通过maxKeySize参数配置了键的最大数量,如果最大键的大小小于0,将不限定键的数量,默认的最大键数是5000.
jcs.auxiliary.DC=
org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=
org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=g:/dev/jakarta-turbine-stratum/raf
jcs.auxiliary.DC.attributes.MaxKeySize=100000
其他的配置选项
索引磁盘缓存提供一些额外的配置选项
磁盘缓存的purgatory的大小是用LRU规则进行存储限定。通过MaxPurgatorySize参数来设定purgatory中所允许的最大元素的数量,默认最大的purgatory的大小是5000.
测试表明在限定了键和purgatory的大小时候,磁盘缓存执行的更好。
jcs.auxiliary.DC.attributes.MaxPurgatorySize=10000
在项目从磁盘缓存中被删除时,数据文件中对应项目的位置就成为空位,索引磁盘缓存会在数据文件中保持空位置的轨迹,这样便于它们能够被重用。这个空位被保存在一个被优化的排序数组中---回收站。在索引缓存达到了指定的限定的大小的时候,最少使用的项目将从回收站中被删除。回收站的设定值(MaxRecycleBinSize)不能比缓存键(MaxKeySize)的设定值大,如果MaxKeySize的值小于0,那么回收站的默认值是5000。
如果所有放入磁盘缓存中项目的大小是相同的,那么回收站就将总是返回与磁盘缓存完全相同的匹配。但是,如果项目的大小不同,那么磁盘缓存将使用不小于,并且最接近准备写入磁盘的项目的大小的自自由位置,因此被回收的位置的大小将比实际写入磁盘的项目的大小要大,这样将有空白位置不能被使用。优化的目的就是删除这种缺陷。
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=10000
通过配置,磁盘缓存能够在运行时整理数据文件,因为整理处理只是在项目被删除时才需要,所以整理的间隔时间是由删除处理的次数来决定的。当前没有方法在规定的时间来运行整理处理。如果把OptimizeAtRemoveCount参数设定为-1,那么直到缓存被关闭时才进行数据文件的优化处理,默认值是-1.
在JCS的1.2.7.0版本中,优化处理被明显的改善,在处理发生时不需要借助临时文件。
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=30000
一个完整的配置实例
在这个例子的cache.cff文件中,把缓存配置成使用默认的叫做DC的磁盘缓存,同时也明确的把叫做myRegion1的缓存区设定给DC使用。为所有的索引缓存配置参数指定了定制的设定值。
##############################################################
##### Default Region Configuration
jcs.default=DC
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=100
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
##############################################################
##### CACHE REGIONS
jcs.region.myRegion1=DC
jcs.region.myRegion1.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.myRegion1.cacheattributes.MaxObjects=1000
jcs.region.myRegion1.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
##############################################################
##### AUXILIARY CACHES
# Indexed Disk Cache
jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=target/test-sandbox/indexed-disk-cache
jcs.auxiliary.DC.attributes.MaxPurgatorySize=10000
jcs.auxiliary.DC.attributes.MaxKeySize=10000
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000
jcs.auxiliary.DC.attributes.OptimizeOnShutdown=true
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=7500
使用线程池减少线程数
索引磁盘缓存允许使用比活动的存储区还要少的线程数,默认的情况下,磁盘缓存将使用标准的专用于线程的缓存事件队列。尽管标准队列会在工作线程停止工作一分钟后关闭它们,但是可以限制线程的总数,通过使用事件队列池可以达到这个目的。
下面的配置文件定义了一个叫做DC2的磁盘缓存,它使用POOLED类型的时间队列,这个队列被命名为disk_cache_event_queue。disk_cache_event_queue被定义在这个文件的底部。
##############################################################
################## DEFAULT CACHE REGION #####################
# sets the default aux value for any non configured caches
jcs.default=DC2
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=200001
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.default.cacheattributes.UseMemoryShrinker=false
jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.ShrinkerIntervalSeconds=60
jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes
jcs.default.elementattributes.IsEternal=false
jcs.default.elementattributes.MaxLifeSeconds=700
jcs.default.elementattributes.IdleTime=1800
jcs.default.elementattributes.IsSpool=true
jcs.default.elementattributes.IsRemote=true
jcs.default.elementattributes.IsLateral=true
##############################################################
################## AUXILIARY CACHES AVAILABLE ################
# Disk Cache Using a Pooled Event Queue -- this allows you
# to control the maximum number of threads it will use.
# Each region uses 1 thread by default in the SINGLE model.
# adding more threads than regions does not help performance.
# If you want to use a separate pool for each disk cache, either use
# the single model or define a different auxiliary for each region and use the Pooled type.
# SINGLE is generally best unless you ahve a huge # of regions.
jcs.auxiliary.DC2=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC2.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC2.attributes.DiskPath=target/test-sandbox/raf
jcs.auxiliary.DC2.attributes.MaxPurgatorySize=10000
jcs.auxiliary.DC2.attributes.MaxKeySize=10000
jcs.auxiliary.DC2.attributes.MaxRecycleBinSize=5000
jcs.auxiliary.DC2.attributes.OptimizeAtRemoveCount=300000
jcs.auxiliary.DC.attributes.OptimizeOnShutdown=true
jcs.auxiliary.DC2.attributes.EventQueueType=POOLED
jcs.auxiliary.DC2.attributes.EventQueuePoolName=disk_cache_event_queue
##############################################################
################## OPTIONAL THREAD POOL CONFIGURATION ########
# Disk Cache Event Queue 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