为什么我的番石榴缓存不断覆盖项目?
Why does my guava cache constantly overwrite items?
大家好,使用番石榴缓存的每个人都偶然发现了这样的问题。我正在尝试在 CacheValue 缓存番石榴中实现存储,其中有一些字段。我做了一个基于LoadingCache的guava缓存,我不明白为什么我添加size()元素时它总是1?
我的番石榴放法:
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;
}
});
}
我的主要class:
AbstractCustomCache gg = new GuavaCache();
for (int i = 0; i < 102; i++) {
gg.put("ab" + i, new CacheValue("ab" + i, System.currentTimeMillis(), 0));
}
gg.get("ab4");
gg.get("ab2");
gg.get("ab0");
我的输出:
CacheValue{value=ab0, creationDate=1549027075333, frequency=0} Size= 1
CacheValue{value=ab1, creationDate=1549027075333, frequency=0} Size= 1
CacheValue{value=ab2, creationDate=1549027075333, frequency=0} Size= 1
CacheValue{value=ab3, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab4, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab5, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab6, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab7, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab8, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab9, creationDate=1549027075334, frequency=0} Size= 1
抽象自定义缓存:
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;
}
问题是什么?如何解决?
您每次使用 put 创建 storage = CacheBuilder.newBuilder()
request.You 应该创建一次。
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;
}
});
上面应该在初始化缓存时调用一次。
所以实际发生的是,对于每个放置请求,您都会创建新存储并在任何时候将 'cacheValue' 添加到 it.Therefore 最大条目为 1.
大家好,使用番石榴缓存的每个人都偶然发现了这样的问题。我正在尝试在 CacheValue 缓存番石榴中实现存储,其中有一些字段。我做了一个基于LoadingCache的guava缓存,我不明白为什么我添加size()元素时它总是1?
我的番石榴放法:
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;
}
});
}
我的主要class:
AbstractCustomCache gg = new GuavaCache();
for (int i = 0; i < 102; i++) {
gg.put("ab" + i, new CacheValue("ab" + i, System.currentTimeMillis(), 0));
}
gg.get("ab4");
gg.get("ab2");
gg.get("ab0");
我的输出:
CacheValue{value=ab0, creationDate=1549027075333, frequency=0} Size= 1
CacheValue{value=ab1, creationDate=1549027075333, frequency=0} Size= 1
CacheValue{value=ab2, creationDate=1549027075333, frequency=0} Size= 1
CacheValue{value=ab3, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab4, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab5, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab6, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab7, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab8, creationDate=1549027075334, frequency=0} Size= 1
CacheValue{value=ab9, creationDate=1549027075334, frequency=0} Size= 1
抽象自定义缓存:
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;
}
问题是什么?如何解决?
您每次使用 put 创建 storage = CacheBuilder.newBuilder()
request.You 应该创建一次。
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;
}
});
上面应该在初始化缓存时调用一次。 所以实际发生的是,对于每个放置请求,您都会创建新存储并在任何时候将 'cacheValue' 添加到 it.Therefore 最大条目为 1.