我正在尝试为仅在短时间内相关的数据创建一个 jboss-cache。在那之后,应该丢弃数据并释放相应的内存。
缓存是这样组织的:
/my_region
/session_1
/datanode_1
attribute1: value1
/datanode_2
attribute2: value2
/session_2
...
/session_3
...
...
...
我的驱逐策略配置如下所示:
<attribute name="EvictionPolicyClass">org.jboss.cache.eviction.LRUPolicy</attribute>
<attribute name="EvictionPolicyConfig">
<config>
<attribute name="wakeUpIntervalSeconds">5</attribute>
<region name="/my_region">
<attribute name="maxNodes">100</attribute>
<attribute name="timeToLiveSeconds">1800</attribute>
</region>
</config>
</attribute>
这很有效:当/my_region
得到超过 100 个孩子时,最近使用最少的孩子被驱逐,这样该区域就会缩小到 100 个孩子。
的问题LRUPolicy
在于,当被驱逐的节点有子节点时,它们并没有被完全删除,而是用jboss:internal:uninitialized: null
标记。这种行为对于被缓存以避免从持久存储中获取它们的实体是有意义的,但它不适合缓存未持久且永远不会再次访问的实体。
所以,为了删除节点,我创建了一个扩展,LRUPolicy
用 remove 覆盖了 evict。
@Override
public void evict(Fqn fqn) throws Exception {
cache_.remove(fqn);
}
此新策略不会留下joss:internal:uninitialized: null
',但会在到达/my_region
时删除节点maxNodes
。当我放回LRUPolicy
后面时,我注意到区域节点本身实际上被驱逐并获得了unitialized
标签,但最近使用的 100 个子节点仍然存在。
如何防止该区域本身被驱逐?有没有更好的方法来进行移除而不是驱逐而不将驱逐与过期分开?
我正在使用 jboss-cache 版本 1.3.0.SP4。