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

Hazelcast Near Cache Not Invalidating After 60 Seconds as Configured

提问人:MustafaOmar 提问时间:8/26/2023 更新时间:8/26/2023 访问量:62

问:

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

根据文档,两个 和 都设置为 60 秒,这意味着条目应在该时间之后失效。但是,我发现即使等待了 60 秒,集合也不是空的(),我什至做到了 3 秒,但数据仍然在缓存映射中。time-to-live-secondsmax-idle-secondssize = 4enter image description here

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

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

这是我的配置:

<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 失效

评论

0赞 mrck 8/27/2023
在 ttl 之后,您应该看到接近缓存大小的零。但在屏幕截图中,它是远程地图的大小,而不是近缓存的大小。尝试获取 local-map-stats 并使用其中的对象来查看接近缓存的大小。NearCacheStats

答:

0赞 Orçun Çolak 8/26/2023 #1

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

仅当您通过 map.get(k) 或 cache.get(k) 方法访问数据时,Near Cache 才有效。

所以 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