gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:03 24 4
gpt4 key购买 nike

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

最佳答案

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

简短回答:

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

jcs.region.resultCache.cacheattributes.OptimizeAtRemoveCount=1

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

更详细的解释:

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

  • BlockDiskCache 没有展示任何管理结果文件大小的机制。 protected freeBlocks 方法仅记录为“将这些 block 添加到空 block 列表”。

  • JDBCDiskCache 非常明显地将管理存储大小的任务委托(delegate)给底层数据库系统。

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

此类优化在以下两个事件之一的情况下被触发:

  • 关于关机
    OptimizeOnShutdown 属性说明的文档:

    By default the Indexed Disk Cache will optimize on shutdown if the free data size is greater than 0. If you want to prevent this behavior, you can set this parameter to false.

    默认值为 true

  • 经过多次删除
    OptimizeAtRemoveCount 属性说明的文档:

    At how many removes should the cache try to defragment the data file. Since we recycle empty spots, defragmentation is usually not needed. To prevent the cache from defragmenting the data file, you can set this to -1. This is the default value.

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

在磁盘缓存的分布式实现中,只有 IndexedDiskCache 提供减少磁盘文件大小的功能。您需要正确配置优化 功能以利用它。目前,任何其他事情都需要重新编写您自己的派生类。

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

关于java - JCS 缓存 - 删除功能不删除特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46986229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com