【发布时间】:2019-06-18 17:52:55
【问题描述】:
从我的应用程序日志中,我觉得在缓存键过期后不会立即调用 removeListener。这在以下场景中产生了问题
缓存配置:
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
GuavaCache cache = new GuavaCache("cacheData", CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.MINUTES).removalListener(expiredCacheListener()).build());
在应用程序逻辑中,我看到当调用cache.get(key) 时,如果没有值(因为缓存因expireAfterAccess() 方法时间限制而过期),那么它会在缓存中放置一个新值由于旧密钥已过期/已删除,因此密钥相同。
在这个写操作之后,我认为removingListener正在调用expiredCacheListener()方法,该方法具有更改过期键值的逻辑.... //但这实际上是在更改新值! !
现在我在缓存中有一个值不正确的有效键
如果一个线程能够使一个键过期,那么同一个线程不应该立即调用removingListener吗?我该如何解决这个问题?
【问题讨论】:
-
如果需要,您可以使用
https://codeshare.io/实时共享代码