ehcache如何进行多线程写入?

How to do multi-threaded writing in ehcache?

下面是我在多线程读写时使用ehcache的代码:

编写代码:

try {
    targetCache.acquireWriteLockOnKey(key);
    targetCache.putIfAbsent(new Element(key, value));
}
finally {
    targetCache.releaseWriteLockOnKey(key);
}

阅读代码:

try{
    cache.acquireReadLockOnKey(key);
    cacheCarId = (String)ele.getObjectValue();
}
finally {
    cache.releaseReadLockOnKey(key);
}

键和值都是字符串。

我的配置如下:

CacheConfiguration config = new CacheConfiguration();
config.name("carCache");
config.maxBytesLocalHeap(128, MemoryUnit.parseUnit("M"));
config.eternal(false);
config.timeToLiveSeconds(60);
config.setTimeToIdleSeconds(60);
SizeOfPolicyConfiguration sizeOfPolicyConfiguration = new SizeOfPolicyConfiguration();
sizeOfPolicyConfiguration.maxDepth(10000);
sizeOfPolicyConfiguration.maxDepthExceededBehavior("abort");
config.addSizeOfPolicy(sizeOfPolicyConfiguration);
Cache memoryOnlyCache = new Cache(config);
CacheManager.getInstance().addCache(memoryOnlyCache);

值在 60​​ 秒内被逐出,将由多线程写入。密钥总数小于25,000。

一开始读写还可以,但是几个小时后,就出现读写不一致的问题了...

有人可以帮我解决这个问题吗?非常感谢

Cache 已经是线程安全的数据结构,因此您不需要像现在这样使用显式锁定。

此外,方法 Cache.putIfAbsent 已经是一个原子操作,可以保证只有一个线程会成功执行 put。

请注意,驱逐和过期是两个不同的事情。使用您的配置,当缓存大小超过 128MB 并且过期确实在 60 秒后发生时,就会发生驱逐。但是 Ehcache 确实会在线过期,因此当您读取或写入映射时会触发它。

至于你对不一致的评论,你需要更详细地描述你的意思。