Mybatis緩存(沒(méi)事兒時(shí)看<毓 )

13、緩存 (了解)

13.1科平、簡(jiǎn)介

查詢  :  連接數(shù)據(jù)庫(kù) 褥紫,耗資源!
    一次查詢的結(jié)果瞪慧,給他暫存在一個(gè)可以直接取到的地方髓考!--> 內(nèi)存 : 緩存
    
我們?cè)俅尾樵兿嗤瑪?shù)據(jù)的時(shí)候,直接走緩存弃酌,就不用走數(shù)據(jù)庫(kù)了
  1. 什么是緩存 [ Cache ]绳军?

    • 存在內(nèi)存中的臨時(shí)數(shù)據(jù)。
    • 將用戶經(jīng)常查詢的數(shù)據(jù)放在緩存(內(nèi)存)中矢腻,用戶去查詢數(shù)據(jù)就不用從磁盤(pán)上(關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)文件)查詢门驾,從緩存中查詢,從而提高查詢效率多柑,解決了高并發(fā)系統(tǒng)的性能問(wèn)題奶是。
  2. 為什么使用緩存?

    • 減少和數(shù)據(jù)庫(kù)的交互次數(shù)竣灌,減少系統(tǒng)開(kāi)銷(xiāo)聂沙,提高系統(tǒng)效率。
  3. 什么樣的數(shù)據(jù)能使用緩存初嘹?

    • 經(jīng)常查詢并且不經(jīng)常改變的數(shù)據(jù)及汉。【可以使用緩存】

13.2屯烦、Mybatis緩存

  • MyBatis包含一個(gè)非常強(qiáng)大的查詢緩存特性坷随,它可以非常方便地定制和配置緩存房铭。緩存可以極大的提升查詢效率。
  • MyBatis系統(tǒng)中默認(rèn)定義了兩級(jí)緩存:一級(jí)緩存二級(jí)緩存
    • 默認(rèn)情況下温眉,只有一級(jí)緩存開(kāi)啟缸匪。(SqlSession級(jí)別的緩存,也稱為本地緩存)

    • 二級(jí)緩存需要手動(dòng)開(kāi)啟和配置类溢,他是基于namespace級(jí)別的緩存凌蔬。

    • 為了提高擴(kuò)展性,MyBatis定義了緩存接口Cache闯冷。我們可以通過(guò)實(shí)現(xiàn)Cache接口來(lái)自定義二級(jí)緩存

13.3砂心、一級(jí)緩存

  • 一級(jí)緩存也叫本地緩存: SqlSession
    • 與數(shù)據(jù)庫(kù)同一次會(huì)話期間查詢到的數(shù)據(jù)會(huì)放在本地緩存中。
    • 以后如果需要獲取相同的數(shù)據(jù)蛇耀,直接從緩存中拿辩诞,沒(méi)必須再去查詢數(shù)據(jù)庫(kù);

測(cè)試步驟:

  1. 開(kāi)啟日志蒂窒!
  2. 測(cè)試在一個(gè)Sesion中查詢兩次相同記錄
  3. 查看日志輸出

[圖片上傳失敗...(image-b26165-1587302900562)]

緩存失效的情況:

  1. 查詢不同的東西

  2. 增刪改操作躁倒,可能會(huì)改變?cè)瓉?lái)的數(shù)據(jù)荞怒,所以必定會(huì)刷新緩存洒琢!

    [圖片上傳失敗...(image-a18a43-1587302900562)]

  3. 查詢不同的Mapper.xml

  4. 手動(dòng)清理緩存!

    [圖片上傳失敗...(image-513b1c-1587302900562)]

小結(jié):一級(jí)緩存默認(rèn)是開(kāi)啟的褐桌,只在一次SqlSession中有效,也就是拿到連接到關(guān)閉連接這個(gè)區(qū)間段!

一級(jí)緩存就是一個(gè)Map揽趾。

13.4具则、二級(jí)緩存

  • 二級(jí)緩存也叫全局緩存,一級(jí)緩存作用域太低了啦撮,所以誕生了二級(jí)緩存
  • 基于namespace級(jí)別的緩存谭网,一個(gè)名稱空間,對(duì)應(yīng)一個(gè)二級(jí)緩存赃春;
  • 工作機(jī)制
    • 一個(gè)會(huì)話查詢一條數(shù)據(jù)愉择,這個(gè)數(shù)據(jù)就會(huì)被放在當(dāng)前會(huì)話的一級(jí)緩存中;
    • 如果當(dāng)前會(huì)話關(guān)閉了织中,這個(gè)會(huì)話對(duì)應(yīng)的一級(jí)緩存就沒(méi)了锥涕;但是我們想要的是,會(huì)話關(guān)閉了狭吼,一級(jí)緩存中的數(shù)據(jù)被保存到二級(jí)緩存中层坠;
    • 新的會(huì)話查詢信息,就可以從二級(jí)緩存中獲取內(nèi)容刁笙;
    • 不同的mapper查出的數(shù)據(jù)會(huì)放在自己對(duì)應(yīng)的緩存(map)中破花;

步驟:

  1. 開(kāi)啟全局緩存

    <!--顯示的開(kāi)啟全局緩存-->
    <setting name="cacheEnabled" value="true"/>
    
  2. 在要使用二級(jí)緩存的Mapper中開(kāi)啟

    <!--在當(dāng)前Mapper.xml中使用二級(jí)緩存-->
    <cache/>
    

    也可以自定義參數(shù)

    <!--在當(dāng)前Mapper.xml中使用二級(jí)緩存-->
    <cache  eviction="FIFO"
           flushInterval="60000"
           size="512"
           readOnly="true"/>
    
  3. 測(cè)試

    1. 問(wèn)題:我們需要將實(shí)體類(lèi)序列化谦趣!否則就會(huì)報(bào)錯(cuò)!

      Caused by: java.io.NotSerializableException: com.kuang.pojo.User
      

小結(jié):

  • 只要開(kāi)啟了二級(jí)緩存旧乞,在同一個(gè)Mapper下就有效
  • 所有的數(shù)據(jù)都會(huì)先放在一級(jí)緩存中蔚润;
  • 只有當(dāng)會(huì)話提交,或者關(guān)閉的時(shí)候尺栖,才會(huì)提交到二級(jí)緩沖中嫡纠!

13.5、緩存原理

[圖片上傳失敗...(image-d78b4c-1587302900562)]

13.6延赌、自定義緩存-ehcache

Ehcache是一種廣泛使用的開(kāi)源Java分布式緩存除盏。主要面向通用緩存

要在程序中使用ehcache,先要導(dǎo)包挫以!

<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.1.0</version>
</dependency>

在mapper中指定使用我們的ehcache緩存實(shí)現(xiàn)者蠕!

<!--在當(dāng)前Mapper.xml中使用二級(jí)緩存-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <!--
       diskStore:為緩存路徑,ehcache分為內(nèi)存和磁盤(pán)兩級(jí)掐松,此屬性定義磁盤(pán)的緩存位置踱侣。參數(shù)解釋如下:
       user.home – 用戶主目錄
       user.dir  – 用戶當(dāng)前工作目錄
       java.io.tmpdir – 默認(rèn)臨時(shí)文件路徑
     -->
    <diskStore path="./tmpdir/Tmp_EhCache"/>
    
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>
 
    <cache
            name="cloud_user"
            eternal="false"
            maxElementsInMemory="5000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LRU"/>
    <!--
       defaultCache:默認(rèn)緩存策略,當(dāng)ehcache找不到定義的緩存時(shí)大磺,則使用這個(gè)緩存策略抡句。只能定義一個(gè)。
     -->
    <!--
      name:緩存名稱杠愧。
      maxElementsInMemory:緩存最大數(shù)目
      maxElementsOnDisk:硬盤(pán)最大緩存?zhèn)€數(shù)待榔。
      eternal:對(duì)象是否永久有效,一但設(shè)置了流济,timeout將不起作用锐锣。
      overflowToDisk:是否保存到磁盤(pán),當(dāng)系統(tǒng)當(dāng)機(jī)時(shí)
      timeToIdleSeconds:設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)绳瘟。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用雕憔,可選屬性,默認(rèn)值是0糖声,也就是可閑置時(shí)間無(wú)窮大斤彼。
      timeToLiveSeconds:設(shè)置對(duì)象在失效前允許存活時(shí)間(單位:秒)。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間姨丈。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用畅卓,默認(rèn)是0.,也就是對(duì)象存活時(shí)間無(wú)窮大蟋恬。
      diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
      diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤(pán)緩存)的緩存區(qū)大小翁潘。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)歼争。
      diskExpiryThreadIntervalSeconds:磁盤(pán)失效線程運(yùn)行時(shí)間間隔拜马,默認(rèn)是120秒渗勘。
      memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí),Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存俩莽。默認(rèn)策略是LRU(最近最少使用)旺坠。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)。
      clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除扮超。
      memoryStoreEvictionPolicy:可選策略有:LRU(最近最少使用取刃,默認(rèn)策略)、FIFO(先進(jìn)先出)出刷、LFU(最少訪問(wèn)次數(shù))璧疗。
      FIFO,first in first out馁龟,這個(gè)是大家最熟的崩侠,先進(jìn)先出。
      LFU坷檩, Less Frequently Used却音,就是上面例子中使用的策略,直白一點(diǎn)就是講一直以來(lái)最少被使用的矢炼。如上面所講系瓢,緩存的元素有一個(gè)hit屬性,hit值最小的將會(huì)被清出緩存裸删。
      LRU八拱,Least Recently Used阵赠,最近最少使用的涯塔,緩存的元素有一個(gè)時(shí)間戳,當(dāng)緩存容量滿了清蚀,而又需要騰出地方來(lái)緩存新的元素的時(shí)候匕荸,那么現(xiàn)有緩存元素中時(shí)間戳離當(dāng)前時(shí)間最遠(yuǎn)的元素將被清出緩存。
   -->

</ehcache>

Redis數(shù)據(jù)庫(kù)來(lái)做緩存枷邪! K-V

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榛搔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子东揣,更是在濱河造成了極大的恐慌践惑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶卧,死亡現(xiàn)場(chǎng)離奇詭異尔觉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)芥吟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)侦铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)专甩,“玉大人,你說(shuō)我怎么就攤上這事钉稍〉佣悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵贡未,是天一觀的道長(zhǎng)种樱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)俊卤,這世上最難降的妖魔是什么缸托? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮瘾蛋,結(jié)果婚禮上俐镐,老公的妹妹穿的比我還像新娘。我一直安慰自己哺哼,他們只是感情好佩抹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著取董,像睡著了一般棍苹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵汰,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天枢里,我揣著相機(jī)與錄音,去河邊找鬼蹂午。 笑死栏豺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豆胸。 我是一名探鬼主播奥洼,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晚胡!你這毒婦竟也來(lái)了灵奖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤估盘,失蹤者是張志新(化名)和其女友劉穎瓷患,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體遣妥,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擅编,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了燥透。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙咏。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辨图,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肢藐,到底是詐尸還是另有隱情故河,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布吆豹,位于F島的核電站鱼的,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痘煤。R本人自食惡果不足惜凑阶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衷快。 院中可真熱鬧宙橱,春花似錦、人聲如沸蘸拔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)调窍。三九已至宝冕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邓萨,已是汗流浹背地梨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缔恳,地道東北人宝剖。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像褐耳,于是被迫代替她去往敵國(guó)和親诈闺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渴庆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容