Java 为什么我的番石榴缓存不断覆盖项目?
大家好,使用番石榴缓存的每个人都偶然发现了这样一个问题。我正在尝试在CacheValue缓存guava中实现存储,其中有一些字段。我在LoadingCache的基础上制作了一个番石榴缓存,我不明白为什么我添加size()元素时它总是1 我的番石榴酱法:Java 为什么我的番石榴缓存不断覆盖项目?,java,caching,guava,Java,Caching,Guava,大家好,使用番石榴缓存的每个人都偶然发现了这样一个问题。我正在尝试在CacheValue缓存guava中实现存储,其中有一些字段。我在LoadingCache的基础上制作了一个番石榴缓存,我不明白为什么我添加size()元素时它总是1 我的番石榴酱法: private LoadingCache<String, CacheValue> storage; private static final Logger LOG = Logger.getLogger(GuavaCache.class
private LoadingCache<String, CacheValue> storage;
private static final Logger LOG = Logger.getLogger(GuavaCache.class);
@Override
public void put(String key, Object value) {
storage.put(key, (CacheValue) value);
storage = CacheBuilder.newBuilder()
.expireAfterAccess(5, TimeUnit.SECONDS)
.maximumSize(MAX_SIZE)
.removalListener(notification -> LOG.info("Element was remove: " + notification.getKey()))
.build(new CacheLoader<String, CacheValue>() {
@Override
public CacheValue load(String key) {
return (CacheValue) value;
}
});
}
抽象自定义缓存:
public abstract class AbstractCustomCache implements CustomCache {
static final int MAX_SIZE = 8;
private Map<String, CacheValue> storage = new ConcurrentHashMap<>();
public Map<String, CacheValue> getStorage() {
return storage;
}
公共抽象类AbstractCustomCache实现CustomCache{
静态最终int MAX_SIZE=8;
私有映射存储=新的ConcurrentHashMap();
公共映射getStorage(){
返回存储;
}
问题是什么?如何解决?每次使用put请求时,您都要创建
storage=CacheBuilder.newBuilder()
。您应该创建一次
storage = CacheBuilder.newBuilder()
.expireAfterAccess(5, TimeUnit.SECONDS)
.maximumSize(MAX_SIZE)
.removalListener(notification -> LOG.info("Element was remove: " + notification.getKey()))
.build(new CacheLoader<String, CacheValue>() {
@Override
public CacheValue load(String key) {
return (CacheValue) value;
}
});
storage=CacheBuilder.newBuilder()
.expireAfterAccess(5,时间单位。秒)
.最大尺寸(最大尺寸)
.removalListener(通知->日志.info(“元素被删除:+notification.getKey()))
.build(新的缓存加载程序(){
@凌驾
公共缓存值加载(字符串键){
返回(CacheValue)值;
}
});
初始化缓存时,应调用一次以上。
因此,实际发生的情况是,对于每个put请求,您都会创建新的存储并向其中添加“cacheValue”。因此,在任何时候,最大条目数都是1。对于put请求,您每次都在创建
storage=CacheBuilder.newBuilder()
。您应该创建一次
storage = CacheBuilder.newBuilder()
.expireAfterAccess(5, TimeUnit.SECONDS)
.maximumSize(MAX_SIZE)
.removalListener(notification -> LOG.info("Element was remove: " + notification.getKey()))
.build(new CacheLoader<String, CacheValue>() {
@Override
public CacheValue load(String key) {
return (CacheValue) value;
}
});
storage=CacheBuilder.newBuilder()
.expireAfterAccess(5,时间单位。秒)
.最大尺寸(最大尺寸)
.removalListener(通知->日志.info(“元素被删除:+notification.getKey()))
.build(新的缓存加载程序(){
@凌驾
公共缓存值加载(字符串键){
返回(CacheValue)值;
}
});
初始化缓存时,应调用一次以上。
因此,实际发生的情况是,对于每个put请求,您都会创建新的存储并向其中添加“cacheValue”。因此,在任何时候,最大条目数都是1。发布完整的
Guavache
类,或者至少发布该类上完整的put
方法。是否可能在每次调用size()的文档发布了完整的put方法
method states返回此缓存中的大致条目数。我的缓存最大大小等于8,但我在缓存中添加了10个元素。这个AbstractCustomCache类是什么?存储是如何使用的?发布完整的GuavaCache
类,或者至少在该类上发布完整的put
方法。是否可以重新创建每次调用GuavaCache#put()
?我都会发布完整的put方法。关于size()
方法状态的文档会返回此缓存中的大致条目数。我的缓存最大大小等于8,但我在缓存中添加了10个元素。这个AbstractCustomCache类是什么?存储是如何使用的?
storage = CacheBuilder.newBuilder()
.expireAfterAccess(5, TimeUnit.SECONDS)
.maximumSize(MAX_SIZE)
.removalListener(notification -> LOG.info("Element was remove: " + notification.getKey()))
.build(new CacheLoader<String, CacheValue>() {
@Override
public CacheValue load(String key) {
return (CacheValue) value;
}
});