游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Mybatis缓存模块

  Mybatis缓存模块缓存模块要实现哪些功能Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能;除核心功能之外,有很多额外的附加功能,如:防止缓存击穿,添加缓存清空策略(fifo、lru)、序列化功能、日志能力、定时清空能力等;附加功能可以以任意的组合附加到核心基础功能之上;
  这个模块因为有很多附加功能,而且这些功能是自由组合的所以Mybatis采用了装饰者模式。装饰者模式不太了解的可以看我之前的文章
  https:mp。toutiao。comprofilev4graphicpreview?pgcid7009090446181990949
  注意这里看的都是一级缓存
  这里查看几个主要的类:Cache:对应装饰者的抽象组件CacheKey:实体类作为缓存的keyPerpetualCache:具体组件BlockingCache:具体装饰器
  CachepublicinterfaceCache{缓存实现类的idStringgetId();往缓存中添加数据,这里的key是Object,key一般是CacheKey对象voidputObject(Objectkey,Objectvalue);根据指定的key从缓存获取数据ObjectgetObject(Objectkey);ObjectremoveObject(Objectkey);voidclear();intgetSize();defaultReadWriteLockgetReadWriteLock(){returnnull;}}
  PerpetualCache:这个类提供了基本的缓存功能PerpetualCacheimplementsCache缓存的mapprivatefinalMapObject,ObjectcachenewHashMap();OverridepublicvoidputObject(Objectkey,Objectvalue){cache。put(key,value);}
  BlockingCachepublicclassBlockingCacheimplementsCache{阻塞的超时时间privatelongtimeout;被装饰的对象,一般是PerpetualCache(组件实现类)privatefinalCachedelegate;锁对象集合,这里的颗粒度是keyprivatefinalConcurrentHashMapObject,CountDownLatchlocks;放缓存信息这个行为不需要加锁OverridepublicvoidputObject(Objectkey,Objectvalue){try{delegate。putObject(key,value);}finally{releaseLock(key);}}获取对象OverridepublicObjectgetObject(Objectkey){获取锁acquireLock(key);Objectvaluedelegate。getObject(key);if(value!null){数据获取成功后释放锁:从lock集合中移除releaseLock(key);}returnvalue;}这个方法在3。5版本的时候是基于ReentrantLock来处理的本次看的版本为3。8paramkeyprivatevoidacquireLock(Objectkey){这里使用CountDownLatch多线程工具保证一个时间内只有一个线程在访问CountDownLatchnewLatchnewCountDownLatch(1);while(true){locks是cuncurrentHashMap线程安全的容器,调用putIfAbsent,利用了容器特性,如果设置过则不会设置成功则会进入上面的自旋CountDownLatchlatchlocks。putIfAbsent(key,newLatch);if(latchnull){break;}try{判断是否有超时时间if(timeout0){booleanacquiredlatch。await(timeout,TimeUnit。MILLISECONDS);if(!acquired){thrownewCacheException(Couldntgetalockintimeoutforthekeykeyatthecachedelegate。getId());}}else{latch。await();}}catch(InterruptedExceptione){thrownewCacheException(Gotinterruptedwhiletryingtoacquirelockforkeykey,e);}}}privatevoidreleaseLock(Objectkey){CountDownLatchlatchlocks。remove(key);if(latchnull){thrownewIllegalStateException(Detectedanattemptatreleasingunacquiredlock。Thisshouldneverhappen。);}这里释countDown释放了锁latch。countDown();}}
  思考一下为什么获取缓存要加锁的方式?
  其实这个是为了防止缓存穿透的。当大量请求来获取缓存中没有对应数据的时候可能发生缓存击穿。这种时候加上锁就可以防止这种问题的产生。
  CacheKey:这个类重点是看一下重写的hash和equal方法publicclassCacheKeyimplementsCloneable,Serializable{privatestaticfinallongserialVersionUID1146682552656046210L;publicstaticfinalCacheKeyNULLCACHEKEYnewCacheKey(){Overridepublicvoidupdate(Objectobject){thrownewCacheException(Notallowedtoupdateanullcachekeyinstance。);}OverridepublicvoidupdateAll(Object〔〕objects){thrownewCacheException(Notallowedtoupdateanullcachekeyinstance。);}};privatestaticfinalintDEFAULTMULTIPLIER37;privatestaticfinalintDEFAULTHASHCODE17;参与hash计算的乘数privatefinalintmultiplier;CacheKey的hash值,在update函数中实时运算出来的privateinthashcode;校验和,hash值的和privatelongchecksum;updateList的中元素个数privateintcount;8212017Sonarlintflagsthisasneedingtobemarkedtransient。Whiletrueifcontentisnotserializable,thisisnotalwaystrueandthusshouldnotbemarkedtransient。privateListObjectupdateList;publicCacheKey(){this。hashcodeDEFAULTHASHCODE;this。multiplierDEFAULTMULTIPLIER;this。count0;this。updateListnewArrayList();}publicCacheKey(Object〔〕objects){this();updateAll(objects);}publicintgetUpdateCount(){returnupdateList。size();}publicvoidupdate(Objectobject){object的基本hash值intbaseHashCodeobjectnull?1:ArrayUtil。hashCode(object);更新count和checksumcount;checksumbaseHashCode;baseHashCodecount;hashcodemultiplierhashcodebaseHashCode;将对象添加到updateList中updateList。add(object);}publicvoidupdateAll(Object〔〕objects){for(Objecto:objects){update(o);}}重写的eq方法paramobjectreturnOverridepublicbooleanequals(Objectobject){比较是不是同一个对象if(thisobject){returntrue;}是否类型相同if(!(objectinstanceofCacheKey)){returnfalse;}finalCacheKeycacheKey(CacheKey)object;hashcode是否相同if(hashcode!cacheKey。hashcode){returnfalse;}checksum是否相同if(checksum!cacheKey。checksum){returnfalse;}count是否相同if(count!cacheKey。count){returnfalse;}以上都不相同,才按顺序比较updateList中元素的hash值是否一致for(inti0;iupdateList。size();i){ObjectthisObjectupdateList。get(i);ObjectthatObjectcacheKey。updateList。get(i);if(!ArrayUtil。equals(thisObject,thatObject)){returnfalse;}}returntrue;}OverridepublicinthashCode(){returnhashcode;}OverridepublicStringtoString(){StringJoinerreturnValuenewStringJoiner(:);returnValue。add(String。valueOf(hashcode));returnValue。add(String。valueOf(checksum));updateList。stream()。map(ArrayUtil::toString)。forEach(returnValue::add);returnreturnValue。toString();}OverridepublicCacheKeyclone()throwsCloneNotSupportedException{CacheKeyclonedCacheKey(CacheKey)super。clone();clonedCacheKey。updateListnewArrayList(updateList);returnclonedCacheKey;}}
  封面侵权删

终于等到你!四部委发布2019新能源汽车补贴政策68客车降幅【第一商用车网原创】2019年新能源汽车补贴政策终于发布!今天(3月26日),财政部联合工信部、科技部和发改委发布关于进一步完善新能源汽车推广应用财政补贴政策的通知……说说今年苹果12最火的手机壳说起手机壳,喜欢软壳硬壳的都有,但是,今天要给大家种草一个很神奇很好看的手机壳玻璃壳。玻璃壳材料很好,全透明还原手机颜色(相信大家也是因为喜欢手机本身颜色所以才会下手呀)……负债17万,想努力还清贷款,去深圳跑美团怎么样?别去。就算你1万一个月,跑死了1万5行不,开支下来一个月1万,一年12万这是理想状态,但这个金额需打5折同是负债者我深有体会,工资还不够还款呢,那怎么办跳出自己的圈子,不……华为鸿蒙系统发布,华为手机将陆续更新,荣耀用户意料之外有惊喜6月2日晚,华为终于发布了自己打造的鸿蒙系统,打通手机、平板、电脑等各终端,实现万物互联,万物智能,在发布会上余承东宣布了华为手机更新的时间表,但只字未担荣耀手机是否更新,让观……安全是不可动摇的核心,标准远超国标,揭秘极氪001三电技术今年4月底,吉利旗下高端纯电品牌极氪汽车的首款车型ZEEKR001正式上市。不同于市场里很多纯电动车型叫好不叫座的状况,ZEEKR001一上市就引发了连极氪官方都没想到的哄抢局……GraalVM实践image与springnativenativeimageGraalVM是从main方法开始分析,所有可达的类和方法会被记录。但是反射、动态代理、资源文件等无法通过简单的静态分析捕获,为了支持这部分代……如何看待小米10s618降价近700元?如果降价700的话,小米10S还是可以购买的,小米10S这款产品是基于小米10而来,其主要有4个地方进行了改变,第一个是将处理器换成了骁龙870,第二个是将扬声器进行了升级,第……再进一步,更强更专业雷蛇战锤狂鲨真无线专业版体验如果说2019年是真无线耳机的爆发之年,那么刚刚过去的2020年则是真无线降噪耳机在细分市场。战锤狂鲨系列作为雷蛇布局手机移动端的耳机产品线在最近也迎来新成员雷蛇战锤狂鲨真无线……明年年底!马斯克透露特斯拉无人驾驶技术实现日期马斯克已经在各种场合说过很多次,特斯拉将会在2019年实现无人驾驶,而昨天,在美国德州举行的SXSW(西南偏南音乐节,同时也是全球最大的人文、科技集会),马斯克再次确认了特斯拉……iOS13。1。3正式版来袭,流畅性,续航是否有提升?iOS13。1。3版体验分享苹果今天推送了iOS13。1。3正式版,本次更新包大小为145MB左右,版本号为:13。1。3(17A8798)本次体验设备为:iPho……观察第12代英特尔酷睿处理器的产品革新会给行业带来什么影响?在2021年的架构日上,英特尔已经向大家比较详细地介绍了12代酷睿的混合架构也就是异构设计,而今天(10月28日),采用这一架构的处理器终于和我们见面,那就是第12代智能英特尔……美军资助的双足机器人自主完成5公里户外跑,用时53分钟据《纽约邮报》网站报道,俄勒冈州立大学宣布,通过机器学习的自学能力,该校学生制造的一台双足机器人跑完了5公里长的路程。报道称,这台被称为卡西(Cassie)的机器人创造了……
又一款纯电代步车,造型时尚,设计如其名说起纯电代步车,大家可能会想到五菱宏观MINIEV、长安奔奔ESTAR等定位微型的小车,说实话,价格便宜、续航里程够用,这些车型的确适合代步。不过,当真的需要乘坐几个人的时候,……通用汽车针对中国的发布了一款全新电动汽车,你怎么看?在这个快速发展的国家成为全球电动汽车领导者之前,别克品牌就为通用汽车在中国汽车市场上奠定了坚实的立足点。周一,这家汽车制造商向中国展示了别克在未来的宏伟事业,其中融入了通用汽车……5g时代就要来了,普通人有什么发财和改变命运的机会?5G时代就要来了,时间表如下:2018年开展试点、2019年试商用、2020年正式商用。对于大多数普通人而言,很难参与5G的实体操作并享受红利,但可以通过买这个产业链的股票来发……远景能源携手达索系统让愿所计必达在变革中破局,在合作中进步。远景能源与达索系统的合作已有多年,借助达索系统全新的3D体验平台,远景能源将升级重构其原有的PLM系统,打造以数字孪生、多元化应用场景为驱动的创新展……桌面净饮3。0博乐宝智能净饮机B16R100使用评测零、序大家好,我是RUARUARUA今年的618,本RUA到没有购买什么大件,毕竟家电智能更新换代十分快,说白了,是被房地产开发商把性子磨没了,本该16年交的房,如……第一次使用的QQ号和微信号第一次,我使用的QQ号。时间在2004年年底,2005年年初。我忘记了!QQ号是9位数45开头的!我在杭州市解放路一家网吧申请的!第一次,我使用的微信号。时间在2013年……使用kubeadm的方式部署v1。21。2版本k8s环境信息:操作系统:CentOSLinuxrelease7。6。1810(Core);docker:19。03。5;kubernetes:v1。21。2master……苹果2021年总共向开发者支付600亿美元品玩1月11日讯,据新浪科技消息,苹果周一表示,2021年总共向开发者支付了600亿美元,自2008年苹果应用商店AppStore推出以来总共支付了2600亿美元,这表明App……9。38万起续航超400km十万级纯电比亚迪海豚正式上市8月29日,纯电新物种比亚迪海豚在成都车展萌动上市,四款车型的售价区间为9。38万元12。18万元,同时为用户带来包括金融服务、维修保养、数据流量等多重好礼。比亚迪海豚是……我想买个手机,就是不知道哪个牌子的手机好?现在市面上就那几家,想要挑手机还是很容易的。一是看品牌影响力,二是看旗下的手机,要是这二点都挺好是可以考虑下的。反正我是用排除法选到了适合自己的手机品牌,像iPhone机,影响……MIUI11都用熟了?MIUI12界面截图曝光,大量功能得到在系统更新速度上,小米和华为应该都是国内比较及时的厂商。今年年初,MIUI官方就已经宣布MIUI12已经起航,那么这款新系统有哪些改进,又有哪些新的玩法,相信是不少米粉都非常期……mac三维设计绘图软件AutoCAD怎样汉化激活?AutoCAD2018mac图文安装教程1、下载完成后打开AutoCAD2018安装包,双击打开【AutodeskAutoCAD2018MacOSX。dmg】,如下图所示……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网