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

Java JCS缓存-删除功能不删除特定元素,java,apache,caching,cache-control,jcs,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(); jav

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

从提供的信息来看,没有事实证明磁盘文件会缩小

简短回答如下:

从提供的配置中,您可能希望通过设置

jcs.region.resultCache.cacheattributes.OptimizeAtRemoveCount=1
顺便说一句,查看代码,您可能会认识到,为了在运行时启用优化,所述属性的值必须为
>0

关于更详细的解释:

当谈论磁盘文件时,我们谈论的是
AbstractDiskCache
类的实现。目前有三个子类:
BlockDiskCache
indexediskcache
JDBCDiskCache

  • BlockDiskCache
    不显示任何管理结果文件大小的机制。protected
    freeBlocks
    方法只是记录为“将这些块添加到emptyBlock列表”

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

  • 这将留下
    IndexedDiskCache
    。作为默认实现,它可能正在您的案例中使用。
    此类展示了指示所需功能的
    optimizeFile()
    方法。在优化过程中,将压缩数据文件,并缩小生成的文件的大小

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

  • 关闭时
    有关
    优化关机的文档
    属性状态:

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

    默认情况下,该值为
    true

  • 多次移除后
    有关
    OptimizatRemoveCount
    属性状态的文档:

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

但是,您的属性不显示要设置的
OptimizatRemoveCount
。因此,任何释放的项都将添加到空闲列表中以供重用,但磁盘文件大小不会减小

从磁盘缓存的分布式实现来看,只有
indexediskcache
提供了减少磁盘文件大小的功能。您需要正确配置优化功能,以充分利用它。 当前任何其他操作都需要恢复到编写您自己的派生类

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