Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的番石榴缓存不断覆盖项目?_Java_Caching_Guava - Fatal编程技术网

Java 为什么我的番石榴缓存不断覆盖项目?

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

大家好,使用番石榴缓存的每个人都偶然发现了这样一个问题。我正在尝试在CacheValue缓存guava中实现存储,其中有一些字段。我在LoadingCache的基础上制作了一个番石榴缓存,我不明白为什么我添加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;
                }
            });
}
抽象自定义缓存:

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
方法。是否可能在每次调用时都会重新创建缓存e> GuavaCache#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;
                }
            });