为什么Hazelcast在CleanupService.registerCache上有清除缓存的固定延迟(60秒)

时间:2016-05-04 13:53:33

标签: java hibernate caching hazelcast second-level-cache

我打开了二级缓存(使用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有清理缓存的固定延迟?

1 个答案:

答案 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