JCS缓存 - 删除功能而不删除特定元素

时间:2017-10-28 04:22:58

标签: java apache caching cache-control jcs

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,请让我知道我在这里做了什么错误,为什么不从文件缓存中删除缓存对象。

enter image description here

属性文件

# 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

1 个答案:

答案 0 :(得分:1)

从提供的信息来看,没有事实证明上升证明了缩小磁盘文件的假设。

简短回答:

从显示的配置中,您可能希望通过设置

来获得预期的行为
jcs.region.resultCache.cacheattributes.OptimizeAtRemoveCount=1

BTW,查看代码,您可能会发现所述属性的值必须为> 0才能在运行时进行优化。

更长的解释:

在谈论磁盘文件时,我们讨论的是AbstractDiskCache类的实现。目前有三个子类:
BlockDiskCacheIndexedDiskCacheJDBCDiskCache

  • BlockDiskCache没有表现出任何管理结果文件大小的机制。受保护的freeBlocks方法只是记录在“将这些块添加到空块列表”中。

  • JDBCDiskCache显然将管理存储大小的任务委托给底层数据库系统。

  • 这会留下IndexedDiskCache。作为默认实现,它可能正在您的情况下使用 此类展示optimizeFile()方法,指示所需的功能。在 optimize 期间,正在压缩数据文件,并且缩小了生成的文件。

如果发生以下两个事件之一,则会触发此类优化

  • shutdown
    有关OptimizeOnShutdown财产状态的文档:

      

    默认情况下,如果可用数据大小大于0,则索引磁盘缓存将在关闭时进行优化。如果要防止此行为,可以将此参数设置为false。

    默认值为true

  • 删除次数
  • 有关OptimizeAtRemoveCount财产状态的文档:

      

    如果缓存尝试对数据文件进行碎片整理,请删除多少次。由于我们回收空白点,通常不需要进行碎片整理。要防止缓存对数据文件进行碎片整理,可以将其设置为-1。这是默认值。

但是,您的媒体资源不会显示OptimizeAtRemoveCount。因此,任何释放的项目都将添加到空闲列表中以供重用,但磁盘文件大小不会减少。

从磁盘缓存的分布式实现中,只有IndexedDiskCache可以减少磁盘文件的大小。您需要正确配置 optimize 功能才能从中受益。 目前还有其他任何东西需要恢复编码你自己的派生类。

另一个注意事项:
磁盘文件优化与 Purgatory 逻辑完全不同。后者涉及从缓存本身中删除值。这样的删除可能会导致磁盘大小减小。