1

(查询部分向中间的问题)

环境

英菲尼斯潘 9.13

具有 jgroups 的集群中的嵌入式缓存(但也可以在本地 basiccache 中看到相同的行为)

单一文件存储

没有明确的驱逐或钝化

<persistence passivation="false">
                <file-store path="/path/to/file/store" max-entries="-1" purge="false"/>
</persistence>
<memory>    
                <binary size="certain size here but never expect it to be met" eviction="MEMORY"/>
</memory>

场景

在某个频率(称为频率)下,一个线程(例如 ExecutorService.scheduleAtFixedRate(...))将 put(key, value, freq + buffer, TimeUnit.minutes) 放入分布式缓存中。

因此,在固定频率下,对于每个具有与以前相同或不同值的键,条目将被放入缓存中,其寿命 = 频率 + 缓冲区(缓冲区只是为了安全,远低于频率)。

例如,插入可能会使用 lifespan=freq+buffer:

k1, v1

k2, v2

k3, v3

在我们使用相同寿命的频率之后:

k1, v1

k2, v4(不同的值)

k3, v3

没有发生驱逐,因为没有达到最大内存大小

问题

在单个文件存储中,键值似乎是重复的,我们在下一个频率 + 缓冲区之后检查得很好。

因此该文件可能在单个文件 store.dat 中:

k1,v1

k1,v1,

k2,v2

k2,v3

(这并不准确,而只是文件存储中的内容的表示)。

我们可以接受重复,因为使用 get() 以编程方式访问总是返回更新的或正确的值(尽管我们可能永远不会在大多数键上调用 get)。

查询

infinispan 是否从单个文件 store.dat 中清理过时的值,以确保文件存储不会随着每个 put() 无限增长,因为在每个频率它都会在末尾附加键值或替换文件内的一些就地(一些键值是重复的,并且在重复中有些是陈旧的,有些是更新的)?

能否请您指出文档/机制,以确保确实发生这种清理并且文件存储不会因为过多的重复/陈旧/过期条目而增长?

文档指的是一个唤醒的过期收割线程,但这里没有明确传递任何内容(因为 xml 文件中没有条目,并且寿命是通过 put() 以编程方式设置的) - 如果过期收割线程正在执行此操作cleanup 我想知道并记录默认的唤醒间隔。

Infinispan 文档中的注释:

陈旧和重复的条目似乎是预期的行为 -

“如果你不使用 eviction,持久存储中的内容基本上是内存中内容的副本。如果你使用 eviction,持久存储中的内容基本上是内存中内容的超集(即它包括已从记忆中驱逐)。” - http://infinispan.org/docs/stable/user_guide/user_guide.html#cache_loader_behavior_with_passivation_disabled_vs_enabled

“如果你没有配置驱逐并且你让这个时间过期,它可以看起来 Infinispan 没有删除条目。” - http://infinispan.org/docs/stable/faqs/faqs.html#expiration_does_not_work_what_is_the_problem

这是清理单个文件 store.dat 中的重复项吗?“当条目过期时,它将驻留在数据容器或缓存存储中,直到用户请求再次访问它。还有一个可选的过期收割机,它可以在给定的可配置的毫秒间隔内运行,它将检查过期条目并删除它们。” - Infinispan 9.2 用户指南

4

0 回答 0