JCS缓存 - 删除功能不删除特定元素
jcs我们的应用程序的缓存配置如下所示,我看到当我们使用fulshAll()方法时,它会删除整个缓存,但是当我们使用remove(key)时,它不会删除该对象。有人可以建议。
public static void init( java.util.Properties properties ) {
java.util.Properties cacheProperties = new java.util.Properties();
java.util.regex.Pattern cachePattern =
java.util.regex.Pattern.compile("^jcs.*");
for (String key:properties.stringPropertyNames()) {
Matcher cacheMatcher = cachePattern.matcher(key);
if ( cacheMatcher.find() ) {
cacheProperties.setProperty(key,properties.getProperty(key));
}
}
CompositeCacheManager ccm =
CompositeCacheManager.getUnconfiguredInstance();
ccm.configure(cacheProperties);
miscCacheAdministrator = JCS.getInstance("miscCache");
metaDataCacheAdministrator = JCS.getInstance("metaDataCache");
resultCacheAdministrator = JCS.getInstance("resultCache");
}
我正在缓存中放置一个元素并将其删除以进行演示。
public static void ExampleCache(String key){
resultCacheAdministrator.put(key, "Temp Cache");
resultCacheAdministrator.remove(key);
logger.debug(" Flushing a Particular Cache "+key);
}
当调用PUT时,我看到对象存储了1kb,我立即用相同的密钥调用remove进行测试,我看到对象仍在那里而没有从缓存中删除,我期待1kb是0,请让我知道我在这里做了什么错误,为什么不从文件缓存中删除缓存对象。
属性文件
# cache settings
jcs.region.resultCache=DC
jcs.region.resultCache.cacheattributes.MaxObjects=0
jcs.region.resultCache.elementattributes.IsEternal=false
jcs.region.resultCache.elementattributes.MaxLife=14400
jcs.region.resultCache.elementattributes.IsSpool=true
jcs.region.resultCache.cacheattributes=org.apache.commons.jcs.engine.
CompositeCacheAttributes
# Disk Cache Event Queue Pool
thread_pool.disk_cache_event_queue.useBoundary=false
thread_pool.disk_cache_event_queue.maximumPoolSize=3
thread_pool.disk_cache_event_queue.minimumPoolSize=1
thread_pool.disk_cache_event_queue.keepAliveTime=3500
thread_pool.disk_cache_event_queue.startUpSize=1
答案 0 :(得分:1)
从提供的信息来看,没有事实证明上升证明了缩小磁盘文件的假设。
简短回答:
从显示的配置中,您可能希望通过设置
来获得预期的行为jcs.region.resultCache.cacheattributes.OptimizeAtRemoveCount=1
BTW,查看代码,您可能会发现所述属性的值必须为> 0
才能在运行时进行优化。
更长的解释:
在谈论磁盘文件时,我们讨论的是AbstractDiskCache
类的实现。目前有三个子类:
BlockDiskCache
,IndexedDiskCache
,JDBCDiskCache
。
BlockDiskCache
没有表现出任何管理结果文件大小的机制。受保护的freeBlocks
方法只是记录在“将这些块添加到空块列表”中。
JDBCDiskCache
显然将管理存储大小的任务委托给底层数据库系统。
这会留下IndexedDiskCache
。作为默认实现,它可能正在您的情况下使用
此类展示optimizeFile()
方法,指示所需的功能。在 optimize 期间,正在压缩数据文件,并且缩小了生成的文件。
如果发生以下两个事件之一,则会触发此类优化:
shutdown
有关OptimizeOnShutdown
财产状态的文档:
默认情况下,如果可用数据大小大于0,则索引磁盘缓存将在关闭时进行优化。如果要防止此行为,可以将此参数设置为false。
默认值为true
。
有关OptimizeAtRemoveCount
财产状态的文档:
如果缓存尝试对数据文件进行碎片整理,请删除多少次。由于我们回收空白点,通常不需要进行碎片整理。要防止缓存对数据文件进行碎片整理,可以将其设置为-1。这是默认值。
但是,您的媒体资源不会显示OptimizeAtRemoveCount
。因此,任何释放的项目都将添加到空闲列表中以供重用,但磁盘文件大小不会减少。
从磁盘缓存的分布式实现中,只有IndexedDiskCache
可以减少磁盘文件的大小。您需要正确配置 optimize 功能才能从中受益。
目前还有其他任何东西需要恢复编码你自己的派生类。
另一个注意事项:
磁盘文件优化与 Purgatory 逻辑完全不同。后者涉及从缓存本身中删除值。这样的删除可能会导致磁盘大小减小。