Hazelcast 近缓存在配置的 60 秒后未失效

问题描述 投票:0回答:1

我已经为我的应用程序(java spring)设置了 Hazelcast 3.12 近缓存,根据我的配置,它应该在 60 秒后使缓存条目无效。但由于某种原因,它似乎并没有这样做。

根据文档,

time-to-live-seconds
max-idle-seconds
都设置为60秒,这意味着该时间之后条目将失效。然而,我发现即使等待了 60 秒,集合也不为空(
size = 4
),我什至等待了 3 秒,数据仍然在缓存映射中。

我已经仔细检查了配置,一切似乎都是正确的。我想知道我是否遗漏了某些内容,或者是否存在与此相关的已知问题。

任何见解或帮助将不胜感激!

这是我的配置:

<near-cache name="near-cache-map">
  <in-memory-format>BINARY</in-memory-format>
  <invalidate-on-change>true</invalidate-on-change>
  <eviction eviction-policy="LRU" max-size-policy="ENTRY_COUNT" size="10000"/>
  <time-to-live-seconds>60</time-to-live-seconds>
  <max-idle-seconds>60</max-idle-seconds>
  <local-update-policy>INVALIDATE</local-update-policy>
</near-cache>
spring caching hazelcast invalidation
1个回答
0
投票

NearCache的目的是避免网络调用。当 IMap 大部分为只读时,它很有用。请参阅文档

中的解释

Near Cache仅在您通过map.get(k)或cache.get(k)方法访问数据时才起作用。

所以NearCache只缓存get()调用的结果。 所有其他调用仍委托给原始 IMap。让我们看一个例子。在服务器端创建一个 IMap 并每秒更新它。

public static void main(String[] args) {
  Config config = new Config();


  String mapName = "mostlyReadMap";
  MapConfig mapConfig = config.getMapConfig(mapName);

  HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config);
  IMap<String, Integer> map = hazelcastInstance.getMap(mapName);
  String key = "1";
  map.put(key, 1);

  Timer timer = new Timer();

  // Create a timer task
  TimerTask task = new TimerTask() {
    @Override
    public void run() {
      int i = map.get(key);
      map.put(key, ++i);
      System.out.println("Timer expired! " + i);
    }
  };
  // Schedule the timer task to run every 1 second
  timer.scheduleAtFixedRate(task, 0,1000);
}

我们将看到该值每 1 秒发生变化

计时器已到! 225
定时器超时! 226
定时器超时! 227
...

现在在客户端有这个 XML

<hazelcast-client xmlns="http://www.hazelcast.com/schema/client-config"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
                  http://www.hazelcast.com/schema/client-config/hazelcast-client-config-5.3.xsd">
    <instance-name>barClient</instance-name>

  <near-cache name="mostlyReadMap">
    <time-to-live-seconds>10</time-to-live-seconds>
    <max-idle-seconds>10</max-idle-seconds>
  </near-cache>

</hazelcast-client>

使用 NearCache 和计时器启动客户端

public static void main(String[] args) {

  HazelcastInstance hazelcastInstanceClient = azelcastClient.newHazelcastClient();
  IMap<String, Integer> nearCache = hazelcastInstance.getMap("mostlyReadMap");

  Timer timer = new Timer();

  String key = "1";
  TimerTask task = new TimerTask() {
    @Override
    public void run() {
      int i = nearCache.get(key);
      log.info("Timer expired! " + i);
    }
  };
  // Schedule the timer task to run after 1 second
  timer.scheduleAtFixedRate(task, 0,1000);
}

您将看到客户端在 10 秒内读取相同 IMap 值即使它已在服务器上更新。因为它使用的是 NearCache 的本地缓存值。 这就是NearCache的目的。 然后 10 秒后,本地条目过期后,客户端将从远程 IMap 获取新值

我希望这能澄清情况

计时器已到! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 211
定时器超时! 221
定时器超时! 221

© www.soinside.com 2019 - 2024. All rights reserved.