SpringBoot緩存

具體在Springboot中使用緩存如下:

1.在pom.xml中引入cache依賴刊橘,添加如下內(nèi)容:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

2.在Spring Boot主類中增加@EnableCaching注解開啟緩存功能骂删,如下:

    @SpringBootApplication
    @EnableCaching 
    public class Application { 
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

3.在數(shù)據(jù)訪問接口中秋冰,增加緩存配置注解,如:

    @CacheConfig(cacheNames = "users") 
    public interface UserRepository extends JpaRepository<User, Long> {
        @Cacheable
        User findByName(String name);
    }

SpringBoot支持很多種緩存方式:redis、guava、ehcahe塌碌、jcache等等。

說明下redis和ehcache的區(qū)別:

Redis:屬于獨立的運行程序旬盯,需要單獨安裝后台妆,使用Java中的Jedis來操縱。因為它是獨立胖翰,所以如果你寫個單元測試程序接剩,放一些數(shù)據(jù)在Redis中,然后又寫一個程序去拿數(shù)據(jù)萨咳,那么是可以拿到這個數(shù)據(jù)的懊缺。,
ehcache:與Redis明顯不同某弦,它與java程序是綁在一起的桐汤,java程序活著,它就活著靶壮。譬如怔毛,寫一個獨立程序放數(shù)據(jù),再寫一個獨立程序拿數(shù)據(jù)腾降,那么是拿不到數(shù)據(jù)的拣度。只能在獨立程序中才能拿到數(shù)據(jù)。

如果使用Ehcache螃壤,只需要在工程中加入ehcache.xml配置文件并在pom.xml中增加ehcache依賴抗果,框架只要發(fā)現(xiàn)該文件,就會創(chuàng)建EhCache的緩存管理器奸晴。

1冤馏、在src/main/resources目錄下創(chuàng)建:ehcache.xml

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
           <cache name="users" maxEntriesLocalHeap="200" timeToLiveSeconds="600">
           </cache>
    </ehcache>

對于EhCache的配置文件也可以通過application.properties文件中使用spring.cache.ehcache.config屬性來指定,比如:

    spring.cache.ehcache.config=classpath:config/another-config.xml

2寄啼、在pom.xml中加入

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

Cache注解詳解

  • @CacheConfig:主要用于配置該類中會用到的一些共用的緩存配置逮光。在這里@CacheConfig(cacheNames = "users"):配置了該數(shù)據(jù)訪問對象中返回的內(nèi)容將存儲于名為users的緩存對象中,我們也可以不使用該注解墩划,直接通過@Cacheable自己配置緩存集的名字來定義涕刚。

  • @Cacheable:配置了findByName函數(shù)的返回值將被加入緩存。同時在查詢時乙帮,會先從緩存中獲取杜漠,若不存在才再發(fā)起對數(shù)據(jù)庫的訪問。該注解主要有下面幾個參數(shù):

    • value察净、cacheNames:兩個等同的參數(shù)(cacheNames為Spring 4新增驾茴,作為value的別名),用于指定緩存存儲的集合名氢卡。由于Spring 4中新增了@CacheConfig沟涨,因此在Spring 3中原本必須有的value屬性,也成為非必需項了
    • key:緩存對象存儲在Map集合中的key值异吻,非必需裹赴,缺省按照函數(shù)的所有參數(shù)組合作為key值,若自己配置需使用SpEL表達式诀浪,比如:@Cacheable(key = "#p0"):使用函數(shù)第一個參數(shù)作為緩存的key值棋返,更多關于SpEL表達式的詳細內(nèi)容可參考官方文檔
    • condition:緩存對象的條件,非必需雷猪,也需使用SpEL表達式睛竣,只有滿足表達式條件的內(nèi)容才會被緩存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3")求摇,表示只有當?shù)谝粋€參數(shù)的長度小于3的時候才會被緩存射沟,若做此配置上面的AAA用戶就不會被緩存殊者,讀者可自行實驗嘗試。
    • unless:另外一個緩存條件參數(shù)验夯,非必需猖吴,需使用SpEL表達式。它不同于condition參數(shù)的地方在于它的判斷時機挥转,該條件是在函數(shù)被調(diào)用之后才做判斷的海蔽,所以它可以通過對result進行判斷。
    • keyGenerator:用于指定key生成器绑谣,非必需党窜。若需要指定一個自定義的key生成器,我們需要去實現(xiàn)org.springframework.cache.interceptor.KeyGenerator接口借宵,并使用該參數(shù)來指定幌衣。需要注意的是:該參數(shù)與key是互斥的
    • cacheManager:用于指定使用哪個緩存管理器,非必需壤玫。只有當有多個時才需要使用
    • cacheResolver:用于指定使用那個緩存解析器泼掠,非必需。需通過org.springframework.cache.interceptor.CacheResolver接口來實現(xiàn)自己的緩存解析器垦细,并用該參數(shù)指定择镇。

除了這里用到的兩個注解之外,還有下面幾個核心注解:

  • @CachePut:配置于函數(shù)上括改,能夠根據(jù)參數(shù)定義條件來進行緩存腻豌,它與@Cacheable不同的是,它每次都會真是調(diào)用函數(shù)嘱能,所以主要用于數(shù)據(jù)新增和修改操作上吝梅。它的參數(shù)與@Cacheable類似,具體功能可參考上面對@Cacheable參數(shù)的解析
  • @CacheEvict:配置于函數(shù)上惹骂,通常用在刪除方法上苏携,用來從緩存中移除相應數(shù)據(jù)。除了同@Cacheable一樣的參數(shù)之外对粪,它還有下面兩個參數(shù):
    • allEntries:非必需右冻,默認為false。當為true時著拭,會移除所有數(shù)據(jù)
    • beforeInvocation:非必需纱扭,默認為false,會在調(diào)用方法之后移除數(shù)據(jù)儡遮。當為true時乳蛾,會在調(diào)用方法之前移除數(shù)據(jù)。

【設定過期時間】

@Cacheable(value = "example#${select.cache.timeout:1000}", key = "")
//example 是cache容器名字 #后邊的是SpEL表達式

更多

  1. 如果需要使用SpringBoot緩存,首先需要開啟基于注解的緩存肃叶。
1.jpg
  1. 第二步是給需要緩存的方法加上相應的注解蹂随,表示將方法的運行結(jié)果進行緩存,以后查詢相同的數(shù)據(jù)直接從緩存中獲取因惭,不需要查詢數(shù)據(jù)庫岳锁。
2.jpg
  1. 在緩存中CacheManager管理多個Cache組件,對緩存的真正CRUD操作在Cache組件中筛欢,每一個緩存組件有自己唯一一個名字浸锨;我們通過cacheNames指定名字唇聘。
3.jpg
  1. 我們可以通過指定緩存條件版姑,只有當條件滿足的時候才緩存。
e49cf91190ef76c69966ed859116fdfaae5167ac.jpg
  1. 我們可以使用unless來否定緩存迟郎,當指定的條件為true剥险,方法的返回值就不會緩存,這個可以以獲取的結(jié)果進行判斷宪肖。

    如果返回的結(jié)果為空表制,我們不進行緩存。

5.jpg
  1. 配置完成之后控乾,我們查詢控制臺日志的打印情況么介。

    執(zhí)行連續(xù)刷新,控制臺上只打印了一次SQL語句蜕衡。

6.jpg

測試緩存

【以下內(nèi)容摘自】
【作者:dalaoyang 】
【鏈接:http://www.reibang.com/p/20975889cf15

還是和以往一樣壤短,使用Controller做測試,先展示一下代碼:

package com.dalaoyang.controller;

import com.dalaoyang.entity.House;
import com.dalaoyang.repository.HouseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author dalaoyang
 * @Description
 * @project springboot_learn
 * @package com.dalaoyang.controller
 * @email yangyang@dalaoyang.cn
 * @date 2018/5/28
 */
@RestController
public class HouseController {

    @Autowired
    private HouseRepository houseRepository;

    //http://localhost:8888/saveHouse?id=1&houseName=別墅&houseSize=1220平方米
    @GetMapping("/saveHouse")
    @CachePut(value = "house", key = "#id")
    public House saveHouse(Integer id,String houseName,String houseSize){
        House house = new House(id,houseName, houseSize);
        houseRepository.save(house);
        return house;
    }

    //http://localhost:8888/queryHouse?id=1
    @GetMapping("/queryHouse")
    @Cacheable(value = "house", key = "#id")
    public House queryHouse(Integer id){
        House house = houseRepository.findOne(id);
        return house;
    }

    //http://localhost:8888/deleteHouse?id=1
    @GetMapping("/deleteHouse")
    @CacheEvict(value = "house", key = "#id")
    public String deleteHouse(Integer id){
        houseRepository.delete(id);
        return "success";
    }

    //http://localhost:8888/deleteCache
    @GetMapping("/deleteCache")
    @CacheEvict(value = "house", allEntries = true)
    public void deleteCache() {
    }
}

解釋測試方法

1.saveHouse方法

方法中使用到了@CachePut注解慨仿,這個注解直接將返回值放入緩存中久脯,通常用于保存和修改方法中

2.queryHouse方法

方法中使用到了@Cacheable注解,這個注解在執(zhí)行前先查看緩存中是不是已經(jīng)存在了镰吆,如果存在帘撰,直接返回。如果不存在万皿,將方法的返回值放入緩存摧找。

3.deleteHouse方法

方法中使用到了@CacheEvict注解,這個注解在執(zhí)行方法執(zhí)行成功后會從緩存中移除

4.deleteCache方法

這個方法的也是使用的@CacheEvict注解牢硅,不同的是使用了allEntries熟悉慰于,默認為false,true的時候移除所有緩存唤衫。

測試

1.首先訪問http://localhost:8888/saveHouse?id=1&houseName=別墅&houseSize=1220平方米婆赠,然后查看數(shù)據(jù)庫和控制臺,如下圖:
image
image
2.訪問http://localhost:8888/queryHouse?id=1,查看頁面數(shù)據(jù)和控制臺休里。因為設置了打印執(zhí)行jpa查詢的話打印sql蛆挫,看下圖控制臺沒有打印,證明在保存的時候@CachePut注解已經(jīng)將其放入了緩存中妙黍。
image
image
3.調(diào)用清空緩存方法http://localhost:8888/deleteCache然后在次訪問查詢方法http://localhost:8888/queryHouse?id=1悴侵,查看控制臺如下,可以到清空緩存后拭嫁,在訪問就需要查詢數(shù)據(jù)庫可免。
image
4.調(diào)用刪除方法http://localhost:8888/deleteHouse?id=1,然后在方法查詢方法http://localhost:8888/queryHouse?id=1做粤,查看控制臺如下浇借,可以到刪除緩存后,在訪問也查詢了數(shù)據(jù)庫怕品。
image
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妇垢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肉康,更是在濱河造成了極大的恐慌闯估,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼和,死亡現(xiàn)場離奇詭異涨薪,居然都是意外死亡,警方通過查閱死者的電腦和手機炫乓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門刚夺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厢岂,你說我怎么就攤上這事光督。” “怎么了塔粒?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵结借,是天一觀的道長。 經(jīng)常有香客問我卒茬,道長船老,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任圃酵,我火速辦了婚禮柳畔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郭赐。我一直安慰自己薪韩,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俘陷,像睡著了一般罗捎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拉盾,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天桨菜,我揣著相機與錄音,去河邊找鬼捉偏。 笑死倒得,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的夭禽。 我是一名探鬼主播霞掺,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驻粟!你這毒婦竟也來了根悼?” 一聲冷哼從身側(cè)響起凶异,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蜀撑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剩彬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酷麦,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年喉恋,在試婚紗的時候發(fā)現(xiàn)自己被綠了沃饶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡轻黑,死狀恐怖糊肤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氓鄙,我是刑警寧澤馆揉,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站抖拦,受9級特大地震影響升酣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜态罪,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一噩茄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧复颈,春花似錦绩聘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驯遇。三九已至,卻和暖如春蓄髓,著一層夾襖步出監(jiān)牢的瞬間叉庐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工会喝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陡叠,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓肢执,卻偏偏與公主長得像枉阵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子预茄,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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