曹操读书--知行合一,化于无形

如何实现一个牛逼的Java本地缓存?这些思路你需要了解

作者 :千锋武汉 2020-12-21 16:50:09 审稿人 : admin 围观 : 评论

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

本文千锋武汉Java小编将来整理一下实现一个本地缓存都应该需要考虑哪些东西?一起往下看吧。TOP曹操读书网

30.jpgTOP曹操读书网

一、考虑点TOP曹操读书网

考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面小编来详细的介绍每个考虑点,以及该如何去实现。TOP曹操读书网

1.数据结构TOP曹操读书网

首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据。或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构。TOP曹操读书网

2.对象上限TOP曹操读书网

因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据。TOP曹操读书网

3.清除策略TOP曹操读书网

上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略。TOP曹操读书网

4.过期时间TOP曹操读书网

除了使用清除策略,一般本地缓存也会有一个过期时间设置,比如redis可以给每个key设置一个过期时间,这样当达到过期时间之后直接删除,采用清除策略+过期时间双重保证。TOP曹操读书网

5.线程安全TOP曹操读书网

像redis是直接使用单线程处理,所以就不存在线程安全问题。而我们现在提供的本地缓存往往是可以多个线程同时访问的,所以线程安全是不容忽视的问题。并且线程安全问题是不应该抛给使用者去保证。TOP曹操读书网

6.简明的接口TOP曹操读书网

提供一个傻瓜式的对外接口是很有必要的,对使用者来说使用此缓存不是一种负担而是一种享受。提供常用的get,put,remove,clear,getSize方法即可。TOP曹操读书网

7.是否持久化TOP曹操读书网

这个其实不是必须的,是否需要将缓存数据持久化看需求。本地缓存如ehcache是支持持久化的,而guava是没有持久化功能的。分布式缓存如redis是有持久化功能的,memcached是没有持久化功能的。TOP曹操读书网

8.阻塞机制TOP曹操读书网

在看Mybatis源码的时候,二级缓存提供了一个blocking标识,表示当在缓存中找不到元素时,它设置对缓存键的锁定。这样其他线程将等待此元素被填充,而不是命中数据库。其实我们使用缓存的目的就是因为被缓存的数据生成比较费时,比如调用对外的接口,查询数据库,计算量很大的结果等等。这时候如果多个线程同时调用get方法获取的结果都为null,每个线程都去执行一遍费时的计算,其实也是对资源的浪费。最好的办法是只有一个线程去执行,其他线程等待,计算一次就够了。但是此功能基本上都交给使用者来处理,很少有本地缓存有这种功能。TOP曹操读书网

二、如何实现TOP曹操读书网

以上大致介绍了实现一个本地缓存我们都有哪些需要考虑的地方,当然可能还有其他没有考虑到的点。下面继续看看关于每个点都应该如何去实现,重点介绍一下思路。TOP曹操读书网

1.数据结构TOP曹操读书网

本地缓存最常见的是直接使用Map来存储,比如guava使用ConcurrentHashMap,ehcache也是用了ConcurrentHashMap,Mybatis二级缓存使用HashMap来存储:TOP曹操读书网

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

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

2.对象上限TOP曹操读书网

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

3.清除策略TOP曹操读书网

配合对象上限之后使用,场景的清除策略如:LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)。TOP曹操读书网

LRU:Least RecentlyTOP曹操读书网

Used的缩写最近最少使用,移除最长时间不被使用的对象。常见的使用LinkedHashMap来实现,也是很多本地缓存默认使用的策略。TOP曹操读书网

FIFO:先进先出,按对象进入缓存的顺序来移除它们。常见使用队列Queue来实现。TOP曹操读书网

LFU:Least FrequentlyTOP曹操读书网

Used的缩写大概也是最近最少使用的意思,和LRU有点像。区别点在LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。可以通过HashMap并且记录访问次数来实现。TOP曹操读书网

SOFT:软引用基于垃圾回收器状态和软引用规则移除对象。常见使用SoftReference来实现。TOP曹操读书网

WEAK:弱引用更积极地基于垃圾收集器状态和弱引用规则移除对象。常见使用WeakReference来实现。TOP曹操读书网

4.过期时间TOP曹操读书网

设置过期时间,让缓存数据在指定时间过后自动删除。常见的过期数据删除策略有两种方式:被动删除和主动删除。TOP曹操读书网

被动删除:每次进行get/put操作的时候都会检查一下当前key是否已经过期,如果过期则删除,类似如下代码:TOP曹操读书网

 image.pngTOP曹操读书网

主动删除:专门有一个job在后台定期去检查数据是否过期,如果过期则删除,这其实可以有效的处理冷数据。TOP曹操读书网

5.线程安全TOP曹操读书网

尽量用线程安全的类去存储数据,比如使用ConcurrentHashMap代替HashMap。或者提供相应的同步处理类,比如Mybatis提供了SynchronizedCache:TOP曹操读书网

 image.pngTOP曹操读书网

6.简明的接口TOP曹操读书网

提供常用的get,put,remove,clear,getSize方法即可,比如Mybatis的Cache接口:TOP曹操读书网

 image.pngTOP曹操读书网

再来看看guava提供的Cache接口,相对来说也是比较简洁的:TOP曹操读书网

 image.pngTOP曹操读书网

7.是否持久化TOP曹操读书网

持久化的好处是重启之后可以再次加载文件中的数据,这样就起到类似热加载的功效。比如ehcache提供了是否持久化磁盘缓存的功能,将缓存数据存放在一个.data文件中。TOP曹操读书网

 image.pngTOP曹操读书网

redis更是将持久化功能发挥到极致,慢慢的有点像数据库了。提供了AOF和RDB两种持久化方式。当然很多情况下可以配合使用两种方式。TOP曹操读书网

8.阻塞机制TOP曹操读书网

除了在Mybatis中看到了BlockingCache来实现此功能,之前在看<>的时候其中有实现一个很完美的缓存,大致代码如下:TOP曹操读书网

 image.pngTOP曹操读书网

compute是一个计算很费时的方法,所以这里把计算的结果缓存起来,但是有个问题就是如果两个线程同时进入此方法中怎么保证只计算一次,这里最核心的地方在于使用了ConcurrentHashMap的putIfAbsent方法,同时只会写入一个FutureTask。TOP曹操读书网

总结TOP曹操读书网

本文大致介绍了要设计一个本地缓存都需要考虑哪些点:数据结构,对象上限,清除策略,过期时间,线程安全,阻塞机制,实用的接口,是否持久化。当然肯定有其他考虑点,欢迎补充。TOP曹操读书网

想了解更多Java方面的知识,你可以关注“千锋武汉”公众号,定期发布技术热点和行业趋势分析,助力你快速入职。TOP曹操读书网

核心关键字: 人工智能 大数据 移动互联网

相关文章

  • 美团会员成“韭菜”,大数据杀熟是如何收割用户的?
    美团会员成“韭菜”,大数据杀熟是如何收割用户的?

    图片来源@视觉中国文|连线Insight,作者|王古锋,编辑|子夜要说今年的行业乱象,大数据杀熟榜上有名:OTA平台上,两部不一样的手机同时预定酒店房间,经常使用该平台的手机的房价高,另一部新号码手机房价低; 电商平台上,购买一款kindle产品,浏览该产品次数更多的人显示价格为998元,浏览次数少的用户显示的价格却只有599元......像这样的案例不胜枚举,可以说国内各大互联网平台已经陷入了大...

    2020-12-20 15:51:13
  • 实现舆情数据价值最大化 需要发挥三个想象力
    实现舆情数据价值最大化 需要发挥三个想象力

    在互联网大数据的推动下,舆情工作出现重大变化与进步,但也面临新的挑战。如何挖掘舆情大数据的价值,需要充分发挥三个想象力。...

    2020-12-19 14:52:07
  • 美团割会员韭菜,大数据杀熟为何屡禁不绝?
    美团割会员韭菜,大数据杀熟为何屡禁不绝?

    文丨王新喜日前,一篇《我被美团会员割了韭菜》的文章把美团顶上了热搜。在笔者看来,平台商业模式与利益决定了部分互联网APP杀熟难以避免,要防范这些平台杀熟,应对方法只有想办法成为平台的“非忠诚度用户”才可以。文章中作者表示,在美团的同一家店铺,同一个配送地址,在同样的时间点单,会员账号的配送费是6元,而非会员账号仅为2元。该用户表示,本以为开通了会员省钱,哪知会员比非会员的配送费高出1~5元。作者表...

    2020-12-19 13:50:47
  • 好看的女生脸怎么捏?赛博朋克2077捏脸数据女
    好看的女生脸怎么捏?赛博朋克2077捏脸数据女

    今天赛博朋克2077正式解锁,很多玩家都进入了游戏体验,游戏可以自由捏脸,问题来了,好看的女生脸怎么捏?小编我特意整理了相关的资讯,接下来就跟着我一起来看看赛博朋克2077捏脸数据女吧。[!--empirenews.page--]今天赛博朋克2077正式解锁,很多玩家都进入了游戏体验,游戏可以自由捏脸,问题来了,好看的女生脸怎么捏?小编我特意整理了相关的资讯,接下来就跟着我一起来看看赛博朋克2077捏脸数据女吧。[!--empirenews.page--]今天赛博朋克2077正式解锁,...

    2020-12-19 06:50:04
  • 七夜公布玄律游戏数据“造假”?52万充值说32万,阿哲大怒要冻结全体心悦主播
    七夜公布玄律游戏数据“造假”?52万充值说32万,阿哲大怒要冻结全体心悦主播

    这两天YY神豪七夜哥与心悦玄律之间的节奏不断,引发许多粉丝对七夜哥不满。玄律上头条喊七夜哥,七夜没去还生气,导致阿哲召集心悦的头部主播开了一个小会,并且对玄律进行了一番批评。但是这件事后,玄律及心悦的一些粉丝,对于七夜哥的意见更大了,有粉丝表示七夜哥有 亏欠 玄律。而这件事情之后,很多外公会的粉丝不断带节奏,而七夜也是接连在两天的直播中对此事进行了回应。七夜直言,自己并非是心悦公会的 家长 ,对于这个身份自己是不承认的。现在YY上关于七夜有很多节奏,因此他也必须要把这事情说清楚,这 锅 他背不起。随后,七...

    2020-12-18 20:47:13
  • 主播神豪低头道歉,引发YY与虎牙粉丝撕逼,都看不上对方攀比数据
    主播神豪低头道歉,引发YY与虎牙粉丝撕逼,都看不上对方攀比数据

    近日,虎牙直播平台出现主播给神豪道歉的事件。因为前YY主播白浩及大哥青蛙哥,在虎牙遭受神豪君子固穷等神豪团体的打压,为求 生存 低头道歉成功上岸。之后一些虎牙水友开始嘲讽YY直播平台的前主播及神豪低头道歉,从而引发不少YY的粉丝不满。于是乎双方粉丝展开了一场 比拼 大赛,开始 攀比 两个直播平台的数据,究竟谁才是大哥。首先是YY这边,虎牙许多的水友前来 挑衅 ,说虎牙直播的人气、神豪、主播远超YY什么的。还说从YY出来的主播白浩及神豪青蛙哥给虎牙神豪道歉,太给YY丢面子了。总之,从虎牙一些水友的讨论,似乎...

    2020-12-18 14:50:02
  • 知乎发布十年用户数据报告:2.4 亿回答汇聚好奇与新知
    知乎发布十年用户数据报告:2.4 亿回答汇聚好奇与新知

    近日,知乎发布“我的知乎十年历”用户数据报告。报告显示,成立十年以来,知乎已经积累了超过4400万个问题和2.4亿个回答。此外,报告还展示了用户在知乎的十年创作和成长足迹。经过十年发展,知乎已成长为一个综合性内容平台,产品功能更加丰富,产出内容更加多元。“我的知乎十年历”记录了知乎十年发展的多个里程碑:2011年1月26日正式上线,2013年正式开放注册,2017年9月用户突破1亿大关,2019年...

    2020-12-18 13:08:13
  • 看到这个数据,中国人都笑了,美国得吐血!
    看到这个数据,中国人都笑了,美国得吐血!

    原创:占豪来源公众号:占豪微信ID:zhanhao668有些事情,就是人算不如天算。特朗普这几年,算计中国多少?简直是罄竹难书!特朗普2017年上台,通过大力减税刺激了经济增长,尔后借助经济数据阶段性向好的时机,在2018年向中国发起贸易战。特朗普的本意是,在美国力量最强的时候制服中国。然而,让特朗普没想到的是,中国的经济实力会那么强,韧劲会那么足,美国对中国无可奈何,最后不得不两次打电话到北京复谈。2020年,新冠疫情在武汉率先被发现和报告,结果美国对中国落井下石,第一宣布从武汉撤离总领馆,同时宣布与中...

    2020-12-18 09:48:47
  • 生活服务业招聘大数据:美容师发型师招聘求职两旺
    生活服务业招聘大数据:美容师发型师招聘求职两旺

    近日, 58同城发布今年1月-10月生活服务业招聘求职大数据。数据显示,深圳招聘求职需求大,美容师、发型师招聘求职供需两旺,行业平均支付月薪6680元;95后求职者占比高,达到25.73%。...

    2020-12-11 15:53:29
  • 水滴公司合伙人兼CTO邱慧谈ABDC战略打法:数据形成壁垒,AI赋能产业
    水滴公司合伙人兼CTO邱慧谈ABDC战略打法:数据形成壁垒,AI赋能产业

    【猎云网北京】12月7日报道(文/尹子璇、吕鑫燚)12月2日,在逆势生长-NFS2020年度CEO峰会暨猎云网创投颁奖盛典上,水滴公司合伙人兼CTO邱慧发表了《科技赋能下的大健康产业新基建》主题演讲。在演讲中,邱慧详细讲述了作为中国领先的互联网健康保障平台,水滴公司是如何基于对大健康行业的理解,在ABDC的战略下,通过技术赋能大健康产业,从而实现线上化、流程化、数据化和智能化的。整体来说,A指的是...

    2020-12-09 17:52:27
留言与评论(共有 0 条评论)
   
验证码: