缓存机制 java_缓存机制:java中缓存的原理

外存:

也就是我们经常说的(CDEF盘的大小)外储存器是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等,一般的软件都是安装在外存中

内存:

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行,此类储存器一般断电后数据就会被清空

高速缓存:

高速缓存是用来协调CPU与主存之间存取速度的差异而设置的。一般情况下,CPU的工作速度高,但内存的工作速度相对较低,为了解决这个问题,通常使用高速缓存,高速缓存的存取速度介于CPU和主存之间。系统将一些CPU在近几个时间段经常访问的内容存入高速缓冲,当CPU需要使用数据时,先在高速缓存中找,如果找到,就不必访问内存了,找不到时,再找内存,这样就在一定程度上缓解了由于主存速度低造成的CPU“停工待料”的情况

---------------------------------------------------------------------------------------------------------------------------

之前一直很不理解这个缓存那个缓存,其实缓存就是把一些外存上的数据保存到内存上而已,怎么保存到内存上呢,我们运行的所有程序,里面的变量值都是放在内存上的,所以说如果要想使一个值放到内存上,实质就是在获得这个变量之后,用一个生存期较长的变量存放你想存放的值,在java中一些缓存一般都是通过map集合来做的。

在Java中经常用到缓存,在SSh框架中也会用到一级缓存和二级缓存,到底缓存是怎么实现的呢?

简单讲就是,如果某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部,比如数据库、硬盘文件等,那么每次操作这些数据的时候都从数据库或者硬盘上去获取,速度会很慢,会造成性能问题。

一个简单的解决方法就是:把这些数据缓存到内存里面,每次操作的时候,先到内存里面找,看有没有这些数据,如果有,那么就直接使用,如果没有那么就获取它,并设置到缓存中,下一次访问的时候就可以直接从内存中获取了。从而节省大量的时间,当然,缓存是一种典型的空间换时间的方案。

在Java中最常见的一种实现缓存的方式就是使用Map, 基本的步骤是:

1.先到缓存里面查找,看看是否存在需要使用的数据

2.如果没有找到,那么就创建一个满足要求的数据,然后把这个数据设置回到缓存中,以备下次使用

3.如果找到了相应的数据,或者是创建了相应的数据,那就直接使用这个数据。

a9a62dcf6c3179da0354f4ca3dc90455.gif

/**

* Java中缓存的基本实现示例

*/

public class JavaCache {

/**

* 缓存数据的容器,定义成Map是方便访问,直接根据Key就可以获取Value了

* key选用String是为了简单,方便演示

*/

private Map map = new HashMap();

/**

* 从缓存中获取值

* @param key 设置时候的key值

* @return key对应的Value值

*/

public Object getValue(String key){

//先从缓存里面取值

Object obj = map.get(key);

//判断缓存里面是否有值

if(obj == null){

//如果没有,那么就去获取相应的数据,比如读取数据库或者文件

//这里只是演示,所以直接写个假的值

obj = key+",value";

//把获取的值设置回到缓存里面

map.put(key, obj);

}

//如果有值了,就直接返回使用

return obj;

}

}

a9a62dcf6c3179da0354f4ca3dc90455.gif

这里只是缓存的基本实现,还有很多功能都没有考虑,比如缓存的清除,缓存的同步等等。当然,Java的缓存还有很多实现方式,也是非常复杂的,现在有很多专业的缓存框架,更多缓存的知识,这里就不再去讨论了。

下面用单例模式实现缓存:

a9a62dcf6c3179da0354f4ca3dc90455.gif

/**

* 使用缓存来模拟实现单例

*/

public class Singleton {

/**

* 定义一个缺省的key值,用来标识在缓存中的存放

*/

private final static String DEFAULT_KEY = "One";

/**

* 缓存实例的容器

*/

private static Map map =

new HashMap();

/**

* 私有化构造方法

*/

private Singleton(){

//

}

public static Singleton getInstance(){

//先从缓存中获取

Singleton instance = (Singleton)map.get(DEFAULT_KEY);

//如果没有,就新建一个,然后设置回缓存中

if(instance==null){

instance = new Singleton();

map.put(DEFAULT_KEY, instance);

}

//如果有就直接使用

return instance;

}

}

a9a62dcf6c3179da0354f4ca3dc90455.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose 一键部署分布式配置中心Apollo

简介说起分布式肯定要想到分布式配置中心、分布式日志、分布式链路追踪等在分布式部署中业务往往有很多配置比如: 应用程序在启动和运行时需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等,都需…

python调用gpu进行运算_用python做GPU计算(1)——安装以及配置

实验小白鼠:联想Y470 显卡 GT550M 操作系统 ubuntu12.04 64位 python2.7ubuntu12.04 需要重新安装显卡驱动,不过可以直接安装cuda_5.0.35_linux_64_ubuntu11.10-1.run 程序包,会一并更新显卡驱动这是官方的下载地址https://developer.nvidia.…

Sharepoint Designer 2007 Workflow

参考 http://office.microsoft.com/en-us/sharepoint-designer-help/collect-data-from-a-user-in-a-workflow-HA010209808.aspx 注意 这里的Review Document是一个Task List, 应该在site里面创建一个task list,可以用默认的Tasks.转载于:https://www.cnblogs.com/F…

各种排序算法及其实现总结

排序算法总结 1.插入排序 一般来说,插入排序 都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序&…

uva705--slash maze

/*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ 1 #include"iostream"2 #include"stdio.…

重磅公开!集14位名师教案的《最全高中数学解题思想方法汇编》

全世界只有3.14 % 的人关注了爆炸吧知识解数学题,除了掌握有关的数学知识之外,最好掌握一定的解题技巧甚至知道点解题思想。要知道高考试题的解答过程中蕴含着重要的数学思想方法,如果能有意识地在解题过程中加以运用,势必会取得很…

极域课堂管理系统软件如何取消控制_智慧物流自动化智能仓储管理架构分析

现阶段,智慧物流(ztmapinfo.com.)成为了时事热点,获得物流界广泛关注。许多 物流自动化系统、物流自动化设备都打出了智慧物流的幌子,在刚结束了的CeMAT亚洲物流展上,宣传展现智慧物流技术与商品的公司增加…

控制 Redis stream 的消息数量

控制 Redis stream 的消息数量IntroRedis Stream 是 Redis 5.0 引入的一个新的类型,之前我们介绍过使用 Redis Stream 来实现消息队列,可以参考之前的文章 使用 Redis Stream 实现消息队列,而 Stream 的消息会持久化地内存中,如果…

java oom-killer_与Linux OOM-killer的第一次亲密接触

From1、最近一段时间(更换了预发机器后)我负责的一个应用的预发环境(线上稳定得像个婴儿~)特别不稳定,最先是应用频频的过几天就发现提供的接口不工作了,但容器Jetty还在跑得欢,于是jstack/jmap看,发现没有一个线程在跑我的war包中…

CentOS+lighttpd+php+mysql (fastcgi)环境的搭建(转)

呵呵!觉得有必要把今晚的装lighttpd的经验和过程给记录下来! 第一次写这样的文章,有什么不足的地方请高手们指出并给与修正!下面开始! 第一步:系统的安装! 菜鸟的朋友们,可以先去lin…

vpx8运行待解决问题

一开始运行的时候是因为找不到HAVE_CONFIG_H他的定义,所以编译无法通过,找了好久还是没有找到,所以就先把它给注释掉了,结果运行的时候还是无法通过,运行的结果如下: 希望赶紧找到解决的办法 1>------ B…

led灯具供货合同

美高森美与索尼合作推出首款具3D功能的定时控制器与局部调光LED背光组合解决方案在刚刚结束的第十一届国际集成电路研讨会暨展览会(IIC-China 2011)上,美高森美公司(Microsemi)展示了与索尼合作推出的目前市场上首款具有3D功能的定时控制器与…

startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...

引言本文是对《redis设计与实现(第二版)》中数据结构与对象相关内容的整理与说明。本篇文章只对对象结构,1种对象——字符串对象。以及字符串对象所对应的两种编码——raw和embstr,进行了详细介绍。表达一些本人的想法与看法,也希望更多朋友一…

网友半夜差点被沐浴露吓死,众人:原来不止我胆小....

全世界只有3.14 % 的人关注了爆炸吧知识微博上有网友爆料说,他半夜上厕所差点被沐浴露吓死!这么看可能不明显但是关灯的时候.....啊啊啊啊啊~结果引来众多网友的共鸣,原来大家都有类似遭遇....比如,你有被饮水机吓到过…

.NET 6 RC1 正式发布

昨天晚上微软发布了.NET 6的两个RC版本中的第一个版本,该版本将于11月正式发布,作为在开源MIT协议下整合所有不同的.NET开发模组件的开源跨平台实现。这是一个从2014年开始,持续多年的,以改变应用开发游戏规则的努力,由…

Winform开发中另一种样式的OutLookBar工具条

很早的时候,曾经写了一篇随笔《WinForm界面开发之“OutLookBar”工具条》介绍了OutLookBar样式的工具条,得到很多同行的热烈反馈,我个人也比较喜欢这样的工具条布局,因此我很多共享软件中,都经常看到这种OutLookBar的工…

常用小知识

在linux 上生成一个字符串的MD5 ,可以直接用linux 上的命令:#md5sumecho -n ’123456′ | md5sum 这样及可。vi 使用:^ 到行首$ 到行尾yy 复制一行p 粘贴u 回退-------------------------------------------------------------------she…

重构的小故事 Change Value to Reference or Vice Verse

值和引用&#xff0c;有时候程序员因为熟悉而忽略了它们之间的区别&#xff0c;因此使用的时候也就不做选择信手拈来。得到预期结果就行&#xff0c;得不到预期结果就换下试试&#xff0c;毕竟两者有其一。那到底是值还是引用呢&#xff1f;有这样一个生活中的故事。<?xml:…

r语言主成分分析_PCA主成分分析

PCA主成分分析最近遇到了主成分分析法这个东西&#xff0c;一开始我觉得简直天才啊&#xff0c;这个想法虽然从经济意义上来解释有点奇怪&#xff0c;毕竟是数学方法计算出来的解释因子&#xff0c;但鉴于没人知道现实世界究竟被多少因素影响&#xff0c;这种方法可以将最主要的…

宫崎骏动画里的新垣结衣见过没?简直美呆!

全世界只有3.14 % 的人关注了爆炸吧知识本文经机器之心&#xff08;ID&#xff1a;almosthuman2014&#xff09;授权转载参与&#xff1a;肖清、思尽管最近 2019 年的图灵奖颁给了计算机图形学、颁给了皮克斯 3D 动画&#xff0c;但很多人可能认为二维动漫更有意思一些。像宫崎…