(查询部分向中间的问题)
环境:
英菲尼斯潘 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 用户指南