【转】Java缓存技术介绍(JCS开源项目)-----索引磁盘备用缓存

  对于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.

 

JCS1.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_queuedisk_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

你可能感兴趣的:(java)