提问人:MustafaOmar 提问时间:8/26/2023 更新时间:8/26/2023 访问量:62
缓存附近的 Hazelcast 在配置的 60 秒后未失效
Hazelcast Near Cache Not Invalidating After 60 Seconds as Configured
问:
我已经为我的应用程序(java spring)设置了Hazelcast 3.12附近的缓存,根据我的配置,它应该在60秒后使缓存条目失效。但出于某种原因,它似乎没有这样做。
根据文档,两个 和 都设置为 60 秒,这意味着条目应在该时间之后失效。但是,我发现即使等待了 60 秒,集合也不是空的(),我什至做到了 3 秒,但数据仍然在缓存映射中。time-to-live-seconds
max-idle-seconds
size = 4
我已经仔细检查了配置,一切似乎都是正确的。我想知道我是否遗漏了什么,或者是否存在与此相关的已知问题。
任何见解或帮助将不胜感激!
这是我的配置:
<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>
答:
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
评论
NearCacheStats