首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JCS缓存-不删除特定元素的删除功能

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

Stack Overflow用户
提问于 2017-10-28 12:22:58
回答 1查看 589关注 0票数 3

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

我们应用程序的jcs Cache配置如下所示,我看到当我们使用fulshAll()方法时,它会删除整个缓存,但当我们使用remove(键)时,它不会删除该对象。有没有人能建议。

代码语言:javascript
复制
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");
}

我在缓存中放置了一个元素,并将其移除以用于演示。

代码语言:javascript
复制
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,请告诉我我做错了什么,为什么缓存对象没有从文件缓存中删除。

属性文件

代码语言:javascript
复制
# 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
EN

回答 1

Stack Overflow用户

发布于 2017-11-01 03:36:49

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

简短的回答是:

从所给出的配置中,您可能希望通过设置

代码语言:javascript
复制
jcs.region.resultCache.cacheattributes.OptimizeAtRemoveCount=1

顺便说一句,看一下代码,你可能会意识到,为了在运行时进行优化,该属性的值必须为> 0

更详细的解释:

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

BlockDiskCacheIndexedDiskCacheJDBCDiskCache

  • BlockDiskCache没有展示任何用于管理结果文件大小的机制。protected list".
  • JDBCDiskCache方法只记录为“将这些块添加到数据库中,这显然是将管理存储大小的任务委派给底层数据库系统。
  • emptyBlock
  • IndexedDiskCache。作为默认实现,它很可能在您的案例中使用。

这个类展示了指示所需功能的optimizeFile()方法。在优化过程中,将压缩数据文件,并减小结果文件的大小。

当发生以下两种事件之一时,将触发此类优化:

  • 处于关闭状态

有关OptimizeOnShutdown属性状态的文档:

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

默认情况下,该值为true

经过多次删除后的

有关OptimizeAtRemoveCount属性状态的文档:

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

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

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

另一个注意事项:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46986229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档