「java缓存信息」java数据缓存方式

博主:adminadmin 2023-01-20 10:42:10 329

今天给各位分享java缓存信息的知识,其中也会对java数据缓存方式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

北大青鸟java培训:什么是浏览器缓存?

什么是浏览器缓存浏览器缓存(BrowerCaching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。

浏览器缓存的优点有:减少了冗余的数据传输,节省了网费减少了服务器的负担,大大提升了网站的性能加快了客户端加载网页的速度在前端开发面试中,浏览器缓存是web性能优化面试题中很重要的一个知识点,从而说明浏览器缓存是提升web性能的一大利器,但是浏览器缓存如果使用不当,也会产生很多问题,正所谓是,想说爱你,并不是很容易的事。

所以,结合最近遇到的案例,本文对浏览器缓存相关的知识进行总结归纳,希望对读者有所帮助。

浏览器缓存的分类浏览器缓存主要有两类:缓存协商和彻底缓存,也有称之为协商缓存和强缓存。

浏览器在第一次请求发生后,再次请求时:浏览器会先获取该资源缓存的header信息,根据其中的expires和cahe-control判断是否命中强缓存,若命中则直接从缓存中获取资源,包括缓存的header信息,本次请求不会与服务器进行通信;如果没有命中强缓存,浏览器会发送请求到服务器,该请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/IF-Modified-Since、Etag/IF-None-Match),由服务器根据请求中的相关header信息来对比结果是否命中协商缓存,若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容强缓存强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。

Expires该字段是http1.0时的规范,它的值为一个绝对时间的GMT格式的时间字符串,比如Expires:Mon,18Oct206623:59:59GMT。

这个时间代表着这个资源的失效时间,在此时间之前,江西电脑培训建议即命中缓存。

这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。

java怎么将数据放入缓存

java放入session缓存中

方法如下:

session.setAttribute("Name",Value);

Name 随便取,value就是要放的数据

获取的时候session.getAttribute("Name);

就可以了

Java网络编程从入门到精通(4):DNS缓存

在通过DNS查找域名的过程中 可能会经过多台中间DNS服务器才能找到指定的域名 因此 在DNS服务器上查找域名是非常昂贵的操作 在Java中为了缓解这个问题 提供了DNS缓存 当InetAddress类第一次使用某个域名(如)创建InetAddress对象后 JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中 当下一次InetAddress类再使用这个域名时 就直接从DNS缓存里获得所需的信息 而无需再访问DNS服务器

DNS缓存在默认时将永远保留曾经访问过的域名信息 但我们可以修改这个默认值 一般有两种方法可以修改这个默认值

在程序中通过java security Security setProperty方法设置安全属性nel的值(单位 秒) 如下面的代码将缓存超时设为 秒

java security Security setProperty( nel   );

设置java security文件中的neorkaddresl属性 假设JDK的安装目录是C \jdk 那么java security文件位于c \jdk \jre\lib\security目录中 打开这个文件 找到nel属性 并将这个属性值设为相应的缓存超时(单位 秒)

如果将nel属性值设为 那么DNS缓存数据将永远不会释放 下面的代码演示了使用和不使用DNS缓存所产生效果

package mynet;import  *;public class MyDNS{    public static void main(String[] args) throws Exception    {        // args[ ]: 本机名 args[ ] 缓冲时间        if (args length   )            return;        java security Security setProperty( nel  args[ ]);        long time = System currentTimeMillis();        InetAddress addresses [] = InetAddress getAllByName(args[ ]);        System out println( addresses :                            + String valueOf(System currentTimeMillis()   time)                        +  毫秒 );        for (InetAddress address : addresses )            System out println(address);        System out print( 按任意键继续 );        System in read();        time = System currentTimeMillis();        InetAddress addresses [] = InetAddress getAllByName(args[ ]);        System out println( addresses :                            + String valueOf(System currentTimeMillis()   time)                        +  毫秒 );        for (InetAddress address : addresses )            System out println(address);    }}

在上面的代码中设置了DNS缓存超时(通过args[ ]参数) 用户可以通过命令行参数将这个值传入MyDNS中 这个程序首先使用getAllByName建立一个InetAddress数组 然后通过System in read使程序暂停 当用户等待一段时间后 可以按任意键继续 并使用同一个域名(args[ ])再建立一个InetAddress数组 如果用户等待的这段时间比DNS缓存超时小 那么无论情况如何变化 addresses 和addresses 数组中的元素是一样的 并且创建addresses 数组所花费的时间一般为 毫秒(小于 毫秒后 Java无法获得更精确的时间)

测试

执行如下命令(将DNS缓存超时设为 秒)

java mynet MyDNS  

运行结果 (在 秒之内按任意键)

addresses :    毫秒/ 按任意键继续addresses :   毫秒/

运行结果 (在 秒后按任意键)

addresses :    毫秒/ 按任意键继续addresses :   毫秒/

在上面的测试中可能出现两个运行结果 如果在出现 按任意键继续… 后 在 秒之内按任意键继续后 就会得到运行结果 从这个结果可以看出 addresses 所用的时间为 毫秒 也就是说 addresses 并未真正访问DNS服务器 而是直接从内存中的DNS缓存得到的数据 当在 秒后按任意键继续后 就会得到运行结果 这时 内存中的DNS缓存中的数据已经释放 所以addresses 还得再访问DNS服务器 因此 addresses 的时间是 毫秒(addresses 和addresses 后面的毫秒数可能在不同的环境下的值不一样 但一般情况下 运行结果 的addresses 的值为 或是一个接近 的数 如 运行结果 的addresses 的值一般会和addresses 的值很接近 或是一个远比 大的数 如 )

测试

执行如下命令(ComputerName为本机的计算机名 DNS缓存超时设为永不过期[ ])

java mynet MyDNS ComputerName 

运行结果(按任意键继续之前 将 删除)

addresses :    毫秒myuniverse/ myuniverse/ 按任意键继续addresses :    毫秒myuniverse/ myuniverse/

从上面的测试可以看出 将DNS缓存设为永不过期后 无论过多少时间 按任意键后 addresses 任然得到了两个IP地址( 和 ) 而且addresses 的时间是 毫秒 但在这时 已经被删除 因此可以判断 addresses 是从DNS缓存中得到的数据 如果运行如下的命令 并在 秒后按任意键继续后 addresses 就会只剩下一个IP地址( )

java mynet MyDNS ComputerName 

如果域名在DNS服务器上不存在 那么客户端在进行一段时间的尝试后(平均为 秒) 就会抛出一个UnknownHostException异常 为了让下一次访问这个域名时不再等待 DNS缓存将这个错误信息也保存了起来 也就是说 只有第一次访问错误域名时才进行 称左右的尝试 以后再访问这个域名时将直接抛出UnknownHostException异常 而无需再等待 秒钟

访问域名失败的原因可能是这个域名真的不存在 也可能是因为DNS服务器或是其他的硬件或软件的临时故障 因此 一般不能将这个域名错误信息一直保留 在Java中可以通过neorkaddresl属性设置保留这些信息的时间 这个属性的默认值是 秒 它也可以通过java security Security setProperty方法或java security文件来设置 下面的代码演示了neorkaddresl属性的用法

package mynet;import  *;public class MyDNS {    public static void main(String[] args) throws Exception    {        java security Security setProperty( neorkaddresl                          );        long time =  ;        try        {            time = System currentTimeMillis();            InetAddress getByName( );        }        catch (Exception e)        {            System out println( 不存在! address :                              + String valueOf(System currentTimeMillis()   time)                            +  毫秒 );        }        //Thread sleep( ); // 延迟 秒        try        {            time = System currentTimeMillis();            InetAddress getByName( );        }        catch (Exception e)        {            System out println( 不存在! address :                              + String valueOf(System currentTimeMillis()   time)                            +  毫秒 );        }    }}

在上面的代码中将neorkaddresl属性值设为 秒 这个程序分别测试了address 和address 访问(这是个不存在的域名 读者可以将其换成任何不存在的域名)后 用了多长时间抛出UnknownHostException异常

运行结果

不存在! address :   毫秒不存在! address :   毫秒

我们从上面的运行结果可以看出 address 使用了 毫秒就抛出了异常 因此 可以断定address 是从DNS缓存里获得了域名不可访问的信息 所以就直接抛出了UnknowHostException异常 如果将上面代码中的延迟代码的注释去掉 那么可能得到如下的运行结果

不存在! address :   毫秒不存在! address :   毫秒

从上面的运行结果可以看出 在第 秒时 DNS缓存中的数据已经被释放 因此 address 仍需要访问DNS服务器才能知道是不可访问的域名

在使用DNS缓存时有两点需要注意

可以根据实际情况来设置nel属性的值 一般将这个属性的值设为 但如果访问的是动态映射的域名(如使用动态域名服务将域名映射成ADSL的动态IP) 就可能产生IP地址变化后 客户端得到的还是原来的IP地址的情况

lishixinzhi/Article/program/Java/hx/201311/11147

Java实现简单的缓存机制原理

package qinbo hui;

/*

设计思想来自-回钦波(qq: )

*/

public class CacheConfModel implements java io Serializable{

private long beginTime;

private boolean isForever = false;

private int durableTime;

public long getBeginTime() {

return beginTime;

}

public void setBeginTime(long beginTime) {

this beginTime = beginTime;

}

public boolean isForever() {

return isForever;

}

public void setForever(boolean isForever) {

this isForever = isForever;

}

public int getDurableTime() {

return durableTime;

}

public void setDurableTime(int durableTime) {

this durableTime = durableTime;

}

}

package qinbo hui;

import java util *;

import test CacheConfModel;

/*

设计思想来自-回钦波(qq: )

*/

public class CacheMgr {

private static Map cacheMap = new HashMap();

private static Map cacheConfMap = new HashMap();

private CacheMgr(){

}

private static CacheMgr cm = null;

public static CacheMgr getInstance(){

if(cm==null){

cm = new CacheMgr();

Thread t = new ClearCache();

t start();

}

return cm;

}

/**

* 增加缓存

* @param key

* @param value

* @param ccm 缓存对象

* @return

*/

public  boolean addCache(Object key Object value CacheConfModel ccm){

boolean flag = false;

cacheMap put(key value);

cacheConfMap put(key ccm);

System out println( now addcache== +cacheMap size());

return true;

}

/**

* 删除缓存

* @param key

* @return

*/

public  boolean removeCache(Object key){

cacheMap remove(key);

cacheConfMap remove(key);

System out println( now removeCache== +cacheMap size());

return true;

}

/**

* 清除缓存的类

* @author wanglj

* 继承Thread线程类

*/

private static class ClearCache extends Thread{

public void run(){

while(true){

Set tempSet = new HashSet();

Set set = cacheConfMap keySet();

Iterator it = erator();

while(it hasNext()){

Object key = it next();

CacheConfModel ccm = (CacheConfModel)cacheConfMap get(key);

//比较是否需要清除

if(!ccm isForever()){

if((new Date() getTime() ccm getBeginTime())= ccm getDurableTime()* * ){

//可以清除 先记录下来

tempSet add(key);

}

}

}

//真正清除

Iterator tempIt = erator();

while(tempIt hasNext()){

Object key = tempIt next();

cacheMap remove(key);

cacheConfMap remove(key);

}

System out println( now thread================ +cacheMap size());

//休息

try {

Thread sleep( * L);

} catch (InterruptedException e) {

// TODO Auto generated catch block

e printStackTrace();

}

}

}

}

lishixinzhi/Article/program/Java/hx/201311/25737

JAVA几种缓存技术介绍说明

1、OSCache

OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何java应用程序的普通的缓存解决方案。

OSCache有以下特点:

(1)缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。

永久缓存--缓存能随意的写入硬盘,因此答应昂贵的创建(eXPensive-to-create)数据来保持缓存,甚至能让应用重启。

(2)支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。

缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(假如默认性能不需要时)。

2、Java Caching System

JSC(Java Caching System)是一个用分布式的缓存系统,是基于服务器的java应用程序。它是通过提供治理各种动态缓存数据来加速动态web应用。

JCS和其他缓存系统一样,也是一个用于高速读取,低速写入的应用程序。

动态内容和报表系统能够获得更好的性能。

假如一个网站,有重复的网站结构,使用间歇性更新方式的数据库(而不是连续不断的更新数据库),被重复搜索出相同结果的,就能够通过执行缓存方式改进其性能和伸缩性。

3、EHCache

EHCache 是一个纯java的在进程中的缓存,它具有以下特性:快速,简单,为Hibernate2.1充当可插入的缓存,最小的依靠性,全面的文档和测试。

4、JCache

JCache是个开源程序,正在努力成为JSR-107开源规范,JSR-107规范已经很多年没改变了。这个版本仍然是构建在最初的功能定义上。

5、ShiftOne

ShiftOne Java Object Cache是一个执行一系列严格的对象缓存策略的Java lib,就像一个轻量级的配置缓存工作状态的框架。

6、SwarmCache

SwarmCache是一个简单且有效的分布式缓存,它使用ip multicast与同一个局域网的其他主机进

行通讯,是非凡为集群和数据驱动web应用程序而设计的。

SwarmCache能够让典型的读操作大大超过写操作的这类应用提供更好的性能支持。

SwarmCache使用JavaGroups来治理从属关系和分布式缓存的通讯。

扩展资料

Java中缓存存在的原因:

一 般情况下,一个网站,或者一个应用,它的一般形式是,浏览器请求应用服务器,应用服务器做一堆计算后再请求数据库,数据库收到请求后再作一堆计算后把数据 返回给应用服务器。

应用服务器再作一堆计算后把数据返回给浏览器,这个是一个标准流程。但是随着互连网的普及,上网的人越来越多,网上的信息量也越来越多。

数据库每秒中接受请求的次数也是有限的,如果利用有限的资源来提供尽可能大的吞吐量呢。一个办法:减少计算量,缩短请求流程(减少网络io或者硬盘io),这时候缓存就可以大展手脚了。

缓存的基本原理就是打破上图中所描绘的标准流程,在这个标准流程中,任何 一个环节都可以被切断.请求可以从缓存里取到数据直接返回。

java缓存信息的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java数据缓存方式、java缓存信息的信息别忘了在本站进行查找喔。