Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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 - Fatal编程技术网

java中的缓存

java中的缓存,java,caching,Java,Caching,伙计们 我正在java中实现一个简单的2级缓存示例: 第一级是记忆 第二个-文件系统 我是java新手,我这样做只是为了理解java中的缓存。 对不起,我的英语不是我的母语:) 我使用LinkedHashMap类和RemoveedMasterry方法完成了第1级,如下所示: import java.util.*; public class level1 { private static final int max_cache = 50; private Map cache = new Link

伙计们 我正在java中实现一个简单的2级缓存示例: 第一级是记忆 第二个-文件系统

我是java新手,我这样做只是为了理解java中的缓存。 对不起,我的英语不是我的母语:)

我使用LinkedHashMap类和RemoveedMasterry方法完成了第1级,如下所示:

import java.util.*;

public class level1 {
private static final int max_cache = 50;
private Map cache = new LinkedHashMap(max_cache, .75F, true) {
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > max_cache;
    }
};


public level1() {
    for (int i = 1; i < 52; i++) {
        String string = String.valueOf(i);
        cache.put(string, string);

        System.out.println("\rCache size = " + cache.size() +
                           "\tRecent value = " + i +
                           " \tLast value = " +
                           cache.get(string) + "\tValues in cache=" +
                           cache.values());

    }

}
import java.util.*;
公营一级{
私有静态最终int max_缓存=50;
私有映射缓存=新LinkedHashMap(最大缓存,.75F,真){
受保护的布尔重构(Map.Entry最早){
返回大小()>最大缓存;
}
};
公共级别1(){
对于(int i=1;i<52;i++){
String String=String.valueOf(i);
cache.put(string,string);
System.out.println(“\rCache size=“+cache.size()+
“\t分数值=”+i+
“\t列表值=”+
cache.get(字符串)+“\t缓存中的值=”+
cache.values());
}
}
现在,我将编写我的第二级代码。我应该编写什么代码、方法来实现此任务:
1) 当一级缓存已满时,RemoveEdestEntry不应删除该值,但应将其移动到二级(到文件)
2) 将新值添加到第一级时,首先应在文件(第二级)中检查该值,如果该值存在,则应将其从第二级移动到第一级


我尝试使用LRUMap升级我的第一级,但编译器在库中找不到类LRUMap,有什么问题吗?可能需要特殊语法?

您可以使用内置的java序列化机制,只需通过使用DataOutputStream包装FileOutputStrem,然后调用writeObjet()将内容发送到文件

此方法很简单,但不够灵活。例如,如果类发生更改,您将无法从文件中读取旧缓存

您可以使用xml序列化,例如JaxB或XStream。我过去使用过XStream,它工作得很好。您可以轻松地将任何集合存储在文件中并还原它


显然,您可以在DB中存储内容,但它更为复杂。

您可以使用内置的java序列化机制,只需通过使用DataOutputStream包装FileOutputStrem,然后调用writeObjet()将内容发送到文件

此方法很简单,但不够灵活。例如,如果类发生更改,您将无法从文件中读取旧缓存

您可以使用xml序列化,例如JaxB或XStream。我过去使用过XStream,它工作得很好。您可以轻松地将任何集合存储在文件中并还原它


显然,您可以将内容存储在DB中,但它更为复杂。

有一点需要注意的是,您的缓存没有考虑线程安全!默认情况下,
LinkedHashMap
不是线程安全的,您需要同步您对它的访问。更好的是,您可以使用它来处理内部同步默认情况下,可以处理16个单独的线程(您可以通过其构造函数之一增加此数量)


我不知道您的确切要求,也不知道您希望它有多复杂,但您是否查看过现有的缓存实现,如库?

有一点需要注意的是,您的缓存没有考虑到线程安全!默认情况下,
LinkedHashMap
不是线程安全的,您需要同步您的访问更好的是,您可以使用它来处理内部同步,默认情况下可以处理16个单独的线程(您可以通过它的一个构造函数增加这个数字)


我不知道您的确切要求,也不知道您希望它有多复杂,但您是否查看过现有的缓存实现,如库?

LRUMap是apache commons中的一个集合,它不在核心Java库中。因此,您需要下载并使用apache commons库来使用LRUMap。如果这是为了lern Java,那么就可以了,我想在生产中使用它,您可以使用EHCache。非常感谢!首先,我应该从学习简单的构造开始,因为我假设EHCache和OSCache等产品中使用了基本原理。LRUMap是apache commons中的一个集合,它不在核心Java库中。因此,您需要下载并使用apachecommons library使用LRUMap。如果这是为了lern java,那么它很好,我想你想在生产中使用它,你可以使用EHCache代替。非常感谢!首先,我应该从学习简单的构造开始,因为我假设EHCache和OSCache等产品中使用了基本原理。我如何覆盖RemoveeLDEStantry来拯救老年人t借助java序列化机制或Xstream将条目保存到文件中?不删除如何覆盖Removeedestentiry以借助java序列化机制或Xstream将最旧条目保存到文件中?不删除