java实现缓存技术

java实现缓存技术,第1张

session最好少用,一般系统都用session来存储用户信息,session用多了对系统开销不好,缓存也尽量少用,要用的话都用在基本不会改变的数据上,不然会影响系统,如果经常改变的量,用了缓存,如:一个程序在用缓存中的数据,而另一个程序却在修改缓存的数据,那边程序就会出现不符合的数据了,如果回答对你有帮助,请把分给我吧,谢谢

(1100)(0)一、什么是缓存1、Cache是高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问2、凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache二、缓存的分类1、基于web应用的系统架构图2、在系统架构的不同层级之间,为了加快访问速度,都可以存在缓存 *** 作系统磁盘缓存->减少磁盘机械 *** 作数据库缓存->减少文件系统I/O应用程序缓存->减少对数据库的查询Web服务器缓存->减少应用服务器请求客户端浏览器缓存->减少对网站的访问三、 *** 作系统缓存1、文件系统提供的DiskCache: *** 作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理2、当应用程序通过文件系统访问磁盘文件的时候, *** 作系统从DiskCache当中读取文件内容,加速了文件读取速度3、DiskCache由 *** 作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于 *** 作系统可以使用尽量多的内存充当DiskCache,加速文件读取速度4、特殊的应用程序对文件系统DiskCache有很高的要求,会绕开文件系统DiskCache,直接访问磁盘分区,自己实现Disk5、Cache策略Oracle的rawdevice(裸设备)–直接抛弃文件系统MySQL的InnoDB:innodb_flush_method=O_DIRECT四、数据库缓存1、重要性数据库通常是企业应用系统最核心的部分数据库保存的数据量通常非常庞大数据库查询 *** 作通常很频繁,有时还很复杂以上原因造成数据库查询会引起非常频繁的磁盘I/O读取 *** 作,迫使CPU挂起等待,数据库性能极度低下2、缓存策略a、QueryCache以SQL作为key值缓存查询结果集一旦查询涉及的表记录被修改,缓存就会被自动删除设置合适的QueryCache会极大提高数据库性能QueryCache并非越大越好,过大的QqueryCache会浪费内存。MySQL:query_cache_size=128Mb、DataBufferdatabuffer是数据库数据在内存中的容器databuffer的命中率直接决定了数据库的性能databuffer越大越好,多多益善MySQL的InnoDBbuffer:innodb_buffer_pool_size=2GMySQL建议bufferpool开大到服务器物理内存60-80%五、应用程序缓存1、对象缓存由O/RMapping框架例如Hibernate提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程,是最省事的缓存策略当软件结构按照O/RMapping框架的要求进行针对性设计,使用对象缓存将会极大降低Web系统对于数据库的访问请求良好的设计数据库结构和利用对象缓存,能够提供极高的性能,对象缓存适合OLTP(联机事务处理)应用2、查询缓存对数据库查询结果集进行缓存,类似数据库的QueryCache适用于一些耗时,但是时效性要求比较低的场景。查询缓存和对象缓存适用的场景不一样,是互为补充的当查询结果集涉及的表记录被修改以后,需要注意清理缓存3、页面缓存a、作用针对页面的缓存技术不但可以减轻数据库服务器压力,还可以减轻应用服务器压力好的页面缓存可以极大提高页面渲染速度页面缓存的难点在于如何清理过期的缓存b、分类I、动态页面静态化利用模板技术将访问过一次的动态页面生成静态html,同时修改页面链接,下一次请求直接访问静态链接页面动态页面静态化技术的广泛应用于互联网CMS/新闻类Web应用,但也有BBS应用使用该技术,例如Discuz!无法进行权限验证,无法显示个性化信息可以使用AJAX请求弥补动态页面静态化的某些缺点II、Servlet缓存针对URL访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布可以进行权限的检查OScache提供了简单的Servlet缓存(通过webxml中的配置)也可以自己编程实现Servlet缓存III、页面内部缓存针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面(例如博客)OSCache提供了简单的页面缓存可以自行扩展JSPTag实现页面局部缓存六、web服务器端缓存基于代理服务器模式的Web服务器端缓存,如squid/nginxWeb服务器缓存技术被用来实现CDN(内容分发网络contentdeliverynetwork)被国内主流门户网站大量采用不需要编程,但仅限于新闻发布类网站,页面实时性要求不高七、基于ajax的浏览器缓存使用AJAX调用的时候,将数据库在浏览器端缓存只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据只适用于使用AJAX技术的页面

你这个分数太少了吧,程序到是有,不过给你有点可惜

CacheMgrjava

import javautil;

import cnjavassframeworkcachevoCacheConfModel;

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();

tstart();

}

return cm;

}

/

增加缓存

@param key

@param value

@param ccm 缓存对象

@return

/

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

boolean flag = false;

cacheMapput(key, value);

cacheConfMapput(key, ccm);

Systemoutprintln("now addcache=="+cacheMapsize());

return true;

}

/

删除缓存

@param key

@return

/

public boolean removeCache(Object key){

cacheMapremove(key);

cacheConfMapremove(key);

Systemoutprintln("now removeCache=="+cacheMapsize());

return true;

}

/

清除缓存的类

@author wanglj

继承Thread线程类

/

private static class ClearCache extends Thread{

public void run(){

while(true){

Set tempSet = new HashSet();

Set set = cacheConfMapkeySet();

Iterator it = setiterator();

while(ithasNext()){

Object key = itnext();

CacheConfModel ccm = (CacheConfModel)cacheConfMapget(key);

//比较是否需要清除

if(!ccmisForever()){

if((new Date()getTime()-ccmgetBeginTime())>= ccmgetDurableTime()601000){

//可以清除,先记录下来

tempSetadd(key);

}

}

}

//真正清除

Iterator tempIt = tempSetiterator();

while(tempIthasNext()){

Object key = tempItnext();

cacheMapremove(key);

cacheConfMapremove(key);

}

Systemoutprintln("now thread================>"+cacheMapsize());

//休息

try {

Threadsleep(601000L);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

}

}

}

}

CacheConfModeljava

public class CacheConfModel implements javaioSerializable{

private long beginTime;

private boolean isForever = false;

private int durableTime;

public long getBeginTime() {

return beginTime;

}

public void setBeginTime(long beginTime) {

thisbeginTime = beginTime;

}

public boolean isForever() {

return isForever;

}

public void setForever(boolean isForever) {

thisisForever = isForever;

}

public int getDurableTime() {

return durableTime;

}

public void setDurableTime(int durableTime) {

thisdurableTime = durableTime;

}

}

顺便说一句,缓存的管理不是靠时间久来计算的,是靠最大不活动间隔计算的,你的设计思想有问题

IO包里面有方法自带缓冲区啊。。。只需要每次用完在用flush清空缓冲区里面的东西就好了,为什么要自己定义个缓冲区呢。如果必须要定义的话,我感觉JAVA中好像没有这个东西吧。。自带缓冲区

以上就是关于java实现缓存技术全部的内容,包括:java实现缓存技术、JAVA缓存框架有哪些意义、使用java实现以个简单的缓存机制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10165990.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存