当前位置:首页 > Java入门 > 正文内容

java 本地缓存设计(java本地缓存框架有哪些)

abcsky884个月前 (01-26)Java入门46

本篇文章给大家谈谈

最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能当然如果拿来和专门的缓存框架如ehcache来对比可能稍有差距。

java 本地缓存设计(java本地缓存框架有哪些)

本文小编将来整理一下实现一个本地缓存都应该需要考虑哪些东西?一起往下看吧。

一、考虑点考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面小编来详细的介绍每个考虑点,以及该如何去实现1.数据结构首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据。

或者复杂的如redis一样提供了多种数据类型网站推广的阶段和特征哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构2.对象上限因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据。

3.清除策略上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略4.过期时间除了使用清除策略,一般本地缓存也会有一个过期时间设置,比如redis可以给每个key设置一个过期时间,这样当达到过期时间之后直接删除,采用清除策略+过期时间双重保证。

5.线程安全像redis是直网站推广的阶段和特征接使用单线程处理,所以就不存在线程安全问题而我们现在提供的本地缓存往往是可以多个线程同时访问的,所以线程安全是不容忽视的问题并且线程安全问题是不应该抛给使用者去保证6.简明的接口。

提供一个傻瓜式的对外接口是很有必要的,对使用者来说使用此缓存不是一种负担而是一种享受提供常用的get,put,remove,clear,getSize方法即可7.是否持久化这个其实不是必须的,是否需要将缓存数据持久化看需求。

本地缓存如ehcache是支持持久化的,而guava是没有持久化功能的分布式缓存如redis是有持久化功能的,memcached是没有持久化功能的8.阻塞机制在看Mybatis源码的时候,二级缓存网站推广的阶段和特征提供了一个blocking标识,表示当在缓存中找不到元素时,它设置对缓存键的锁定。

这样其他线程将等待此元素被填充,而不是命中数据库其实我们使用缓存的目的就是因为被缓存的数据生成比较费时,比如调用对外的接口,查询数据库,计算量很大的结果等等这时候如果多个线程同时调用get方法获取的结果都为null,每个线程都去执行一遍费时的计算,其实也是对资源的浪费。

最好的办法是只有一个线程去执行,其他线程等待,计算一次就够了但是此功能基本上都交给使用者来处理,很少有本地缓存有这种功能二、如何实现以上大致介绍了实现一个本地缓存我们都有哪些需要考虑的地方,当然可能还有其他没有考虑到的点。

下面继续看看关于每个点都应网站推广的阶段和特征该如何去实现,重点介绍一下思路1.数据结构本地缓存最常见的是直接使用Map来存储,比如guava使用ConcurrentHashMap,ehcache也是用了ConcurrentHashMap,Mybatis二级缓存使用HashMap来存储:

Map cache = new ConcurrentHashMap ()Mybatis使用HashMap本身是非线程安全的,所以可以看到起内部使用了一个SynchronizedCache用来包装,保证线程的安全性。

当然除了使用Map来存储,可能还使用其他数据结构来存储,比如redis使用了双端链表,压缩列表,整数集合,跳跃表和字典当然这主要是因为redis网站推广的阶段和特征对外提供的接口很丰富除了哈希还有列表,集合,有序集合等功能。

2.对象上限本地缓存常见的一个属性,一般缓存都会有一个默认值比如1024,在用户没有指定的情况下默认指定当缓存的数据达到指定最大值时,需要有相关策略从缓存中清除多余的数据这就涉及到下面要介绍的清除策略3.清除策略

配合对象上限之后使用,场景的清除策略如:LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)LRU:Least RecentlyUsed的缩写最近最少使用,移除最长时间不被使用的对象。

常见的使用LinkedHashMap来实现,也是很多本地缓存默认使用的策略FIFO:先进网站推广的阶段和特征先出,按对象进入缓存的顺序来移除它们常见使用队列Queue来实现LFU:Least FrequentlyUsed的缩写大概也是最近最少使用的意思,和LRU有点像。

区别点在LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的可以通过HashMap并且记录访问次数来实现SOFT:软引用基于垃圾回收器状态和软引用规则移除对象常见使用SoftReference来实现。

WEAK:弱引用更积极地基于垃圾收集器状态和弱引用规则移除对象常见使用WeakReference来实现4.过期时间设置过期时间,让缓存数据在指定时间过后自动删除常见的过期数据删除策略有两种方式:被动删除和主动删除。

被动删除:每次进行g网站推广的阶段和特征et/put操作的时候都会检查一下当前key是否已经过期,如果过期则删除,类似如下代码:

主动删除:专门有一个job在后台定期去检查数据是否过期,如果过期则删除,这其实可以有效的处理冷数据5.线程安全尽量用线程安全的类去存储数据,比如使用ConcurrentHashMap代替HashMap或者提供相应的同步处理类,比如Mybatis提供了SynchronizedCache:。

6.简明的接口提供常用的get,put,remove,clear,getSize方法即可,比如Mybatis的Cache接口:

再来看看guava提供的Cache接口,相对来说也是比较简洁的:

7.是否持久化持久化的好处是重启之网站推广的阶段和特征后可以再次加载文件中的数据,这样就起到类似热加载的功效。比如ehcache提供了是否持久化磁盘缓存的功能,将缓存数据存放在一个.data文件中。

redis更是将持久化功能发挥到极致,慢慢的有点像数据库了提供了AOF和RDB两种持久化方式当然很多情况下可以配合使用两种方式8.阻塞机制除了在Mybatis中看到了BlockingCache来实现此功能,之前在看<>的时候其中有实现一个很完美的缓存,大致代码如下:。

compute是一个计算很费时的方法,所以这里把计算的结果缓存起来,但是有个问题就是如果两个线程同时进入此方法中怎么保证只计算一次,这里最核心的地方在于使用了ConcurrentHashM网站推广的阶段和特征ap的putIfAbsent方法,同时只会写入一个FutureTask。

总结本文大致介绍了要设计一个本地缓存都需要考虑哪些点:数据结构,对象上限,清除策略,过期时间,线程安全,阻塞机制,实用的接口,是否持久化当然肯定有其他考虑点,欢迎补充想了解更多Java方面的知识,你可以关注小编,定期发布技术热点和行业趋势分析,助力你快速入职。

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://www.4blc.com/post/13127.html

分享给朋友:

“java 本地缓存设计(java本地缓存框架有哪些)” 的相关文章

java学到什么程度才能找工作(java学到什么地步可以找工作)

本篇文章给大家谈谈 很多应届生找工作没自信,不知道自己学习的东西能不能胜任企业里的工作,网上一搜,介绍的全是各种没有接触过的技术,然后就更焦虑了到底学到什么程度就可以找工作了呢,今天我给大家说一下最低要求第一,基础部分,如初级语法,容器,异常,io流,多线程,注解等 第二,...

38810算24点怎么算式小学(38810算24点怎么算式短)

本文分享给大家的是: 原标题:面试官:3,3,8,8怎么算出24?小伙立刻被录用如今的面试官为了选拔出适合自己公司岗位的人才,可谓是煞费苦心他们已经不满足于简简单单的问题,而是另辟蹊径,希望能够用最简单的方式尽量考察出面试者的综合能力。 我们今天要说的就是面试官的一个奇葩问...

java语言主要特点是什么?(java语言的十二大特点)

本篇文章给大家谈谈 1、Java 发展简史1991 年,James Gosling 在 SUN 公司的工程师小组想要设计这样一种小型计算机语言该语言主要用于像电视盒这样的消费类电子产品另外,由于不同的厂商选择不同的 CPU和操作系统,因此,要求该语言不能和特定的体系结构绑在一起,要...

java面试回答不上来(java面试答不上来怎么办)

今天给各位分享 不少Java程序员,在在应聘一些中大型互联网公司的Java工程师岗位时,经常会遇到如下困惑这些同学说自己也做了精心准备,网上搜集了不少Java面试题然而实际去互联网公司面试才发现,人家问的,和你准备的根本对不上号,面试现场经常弥漫着尴尬的气氛,最后的面试结果也是不言...

面试官有哪些职位(面试官是干什么的)

今天给各位分享 很多同学会问Java面试八股文有必要背吗?我的回答是:很有必要你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂国内的互联网面试,恐怕是现存的、最接近科举考试的制度而且,我国的八股文确实是独树一帜。 以美国为例,北美工程师面试比较重视算法(Codin...

java面向对象程序设计基础教程(java面向对象程序开发及实战)

本篇文章给大家谈谈 今天是小A注重代码开发开发的第一篇,以后也会陆续更新,请大家多多关注想获得老师指导和自学教程的同学,请联系直接留言或者加老师微信LNYK_lily或13006356038联系获取指导!今天讲解目录来了:。  面向对象思想:  面向过程(PO):一种较早的...