3

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
4

1 回答 1

1

从所提供的信息来看,没有任何事实可以证明上升磁盘文件的假设。

简短的回答:

从提供的配置中,您可能期望通过设置获得预期的行为

jcs.region.resultCache.cacheattributes.OptimizeAtRemoveCount=1

顺便说一句,查看代码您可能会认识到所述属性的值必须> 0用于在运行时启用优化。

如需更长的解释:

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

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

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

  • 这就离开了IndexedDiskCache。作为默认实现,它可能正在您的案例中使用。
    此类展示optimizeFile()了指示所需功能的方法。在优化期间,数据文件被压缩并且生成的文件的大小减小。

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

  • 关于关闭属性状态的
    文档:OptimizeOnShutdown

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

    默认情况下,该值为true

  • 多次搬迁
    后 关于OptimizeAtRemoveCount财产状态的文件:

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

但是,您的属性未显示OptimizeAtRemoveCount为已设置。因此,任何被释放的项目都将被添加到空闲列表中以供重复使用,但磁盘文件大小不会减少。

从磁盘缓存的分布式实现来看,只IndexedDiskCache提供了减少磁盘文件大小。您需要正确配置优化功能以利用它。目前其他任何事情都需要恢复到对您自己的派生类进行编码。

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

于 2017-10-31T19:36:48.553 回答