我打开了二级缓存(使用Hazelcast实现)并设置:
<map name="default">
<time-to-live-seconds>10</time-to-live-seconds>
<max-idle-seconds>0</max-idle-seconds>
</map>
然后,我使用session.save(entity)
保存了实体。然后我手动从DB中删除了实体,并检查实体是否存在于缓存中。它仍然存在并且没问题。然后我等了20秒并调用该方法获取实体session.get(entity.id)
并返回实体。我很困惑,因为我已经将time-to-live-seconds
设置为10秒并且期望会话返回一个空对象。
我看了src:
private static final long FIXED_DELAY = 60;
private static final long FIXED_DELAY1 = 60;
public void More ...registerCache(final LocalRegionCache cache) {
executor.scheduleWithFixedDelay(new Runnable() {
public void More ...run() {
cache.cleanup();
}
}, FIXED_DELAY, FIXED_DELAY1, TimeUnit.SECONDS);
问题:为什么hazelcast有清理缓存的固定延迟?
答案 0 :(得分:2)
Hazelcast LocalCacheRegionFactory
不使用分布式地图,而是使用本地缓存,并通过ITopic执行缓存失效。您可以从文档中查看详细的体系结构:
http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#hazelcastlocalcacheregionfactory
本地缓存的驱逐是根据默认缓存超时值1小时或默认hazelcast映射的ttl值,在您的情况下为10秒。然而,驱逐采样是按照你所说的固定间隔完成的,这是60秒并且不可配置。由于LocalRegionCache不使用hazelcast自己的IMap,因此您需要等待最初的60秒进行第一次采样。(采样代码已完成here)
但是,如果您使用使用IMap的HazelcastCacheRegionFactory,则可以为每个实体区域配置ttl。我们假设您有一个名为com.hazelcast.hibernate.entity.DummyEntity
的实体,并且如果您配置IMap地图,该地图缓存存储此实体的区域缓存,如下所示:
<map name="com.hazelcast.hibernate.entity.DummyEntity">
<time-to-live-seconds>10</time-to-live-seconds>
<max-idle-seconds>0</max-idle-seconds>
</map>
您应该可以使用ttl impl进行IMap。
同样对于LocalCacheRegionFactory
情况,最好使用户可以配置固定延迟。您可以在hazelcast hibernate repo下创建issue。