SpringBoot如何整合并使用Ehcache緩存框架

概述

上一節(jié)我們講了SpringBoot整合Redis緩存嘹叫,這節(jié)我們來講Ehcache蓬痒。EhCache 是一個純Java的輕量級進程內(nèi)緩存框架秽澳,具有快速闯睹、簡單等特點,是Hibernate中默認(rèn)的緩存提供方肝集。
相對于Redis這類可分布式的緩存中間件,Ehcache是屬于進程內(nèi)緩存,和Guava Cache瞻坝、Caffeine等緩存框架一樣都屬于堆內(nèi)存緩存,適合單點使用蛛壳,不太適合分布式場景杏瞻。

EhCache有哪些特點

  • 快速,簡單衙荐,并且提供多種緩存策略捞挥;
  • 緩存數(shù)據(jù)有兩級:內(nèi)存和磁盤,無需擔(dān)心容量問題忧吟;
  • 緩存數(shù)據(jù)會在虛擬機重啟的過程中寫入磁盤砌函;
  • 可以通過RMI、可插入API等方式進行分布式緩存溜族;
  • 具有緩存和緩存管理器的偵聽接口讹俊;
  • 支持多緩存管理器實例,以及一個實例的多個緩存區(qū)域煌抒;
  • 提供Hibernate的緩存實現(xiàn)仍劈;

開始在SpringBoot項目中使用Ehcache

※在上一節(jié)Redis的基礎(chǔ)上,把redis相關(guān)的內(nèi)容刪除

  1. 在pom.xml中加入ecache依賴
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>
  1. 在資源根目錄下創(chuàng)建ehcache.xml文件,內(nèi)容如下
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <!-- 操作系統(tǒng)緩存的臨時目錄,內(nèi)存滿后寫入該目錄 -->
    <diskStore path="java.io.tmpdir"/>

    <!-- 默認(rèn)緩存
         maxElementsInMemory:內(nèi)存中最多可以存放的元素數(shù)量
            overflowToDisk=true:將Cache中多出的元素放入磁盤文件中
            overflowToDisk=false:根據(jù)memoryStoreEvictionPolicy策略替換Cache中原有的元素
         eternal:緩存中對象是否永久有效
         imeToIdleSeconds:當(dāng)eternal=false時使用,緩存數(shù)據(jù)有效期(單位:秒),時間段內(nèi)沒有訪問該元素,將被清除
         timeToLiveSeconds:緩存數(shù)據(jù)的存活時間
         maxElementsOnDisk:磁盤緩存中最多可以存放的元素數(shù)量
         diskExpiryThreadIntervalSeconds:磁盤緩存的清理線程運行間隔
         memoryStoreEvictionPolicy:緩存釋放策略,LRU會優(yōu)先清理最少使用的緩存
         localTempSwap:持久化策略寡壮,當(dāng)堆內(nèi)存或者非堆內(nèi)存里面的元素已經(jīng)滿了的時候贩疙,將其中的元素臨時的存放在磁盤上讹弯,重啟后就會消失
    -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="3600"
            timeToLiveSeconds="3600"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LFU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>

    <cache name="users"
           maxEntriesLocalHeap="200"
           timeToLiveSeconds="600">
    </cache>
</ehcache>
  1. 在yml文件中,加入ehcache配置信息
# Spring配置
spring:
  cache:
    ehcache:
      config: classpath:ehcache.xml
  1. 在啟動類上加入@EnableCaching開啟緩存

  2. Service層,和上節(jié)一樣,代碼如下:

package com.zhlab.demo.service;

import com.zhlab.demo.dao.SysAdminUserRepository;
import com.zhlab.demo.model.SysAdminUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * @ClassName SysAdminUserService
 * @Description //SysAdminUserService
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:45
 **/
@CacheConfig(cacheNames = "users")
@Service
public class SysAdminUserService {

    @Autowired
    SysAdminUserRepository sysAdminUserRepository;
    

    @Cacheable(key="'user_'+#userId")
    public SysAdminUser findUser(Long userId){
        return sysAdminUserRepository.findById(userId).orElse(null);
    }

    @CachePut(key="'user_'+#result.adminUserId")
    public SysAdminUser save(SysAdminUser user){
        return sysAdminUserRepository.save(user);
    }

    @CacheEvict(key="'user_'+#userId")
    public void deleteUser(Long userId) {
        sysAdminUserRepository.findById(userId).ifPresent(sysAdminUserRepository::delete);
    }
}

  1. 在接口層,我們來測試一下緩存是否實現(xiàn)了,注釋部分就是需要測試的位置
package com.zhlab.demo.controller;

import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.service.SysAdminUserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassName UserController
 * @Description //用戶接口層
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:43
 **/
@RestController
@RequestMapping("/user")
public class UserController {
    

    @Autowired
    SysAdminUserService sysAdminUserService;

    @Autowired
    private CacheManager cacheManager;


    @ApiOperation(value = "方法名:用戶信息", notes = "獲取用戶信息")
    @GetMapping("/{userId}")
    public SysAdminUser findUser(@PathVariable Long userId){

        // 查看一下CacheManager是否已經(jīng)是EhCacheCacheManager
        System.out.println("CacheManager type : " + cacheManager.getClass());

        // 查詢用戶信息的時候,有無sql檢索
        SysAdminUser userInfo =sysAdminUserService.findUser(userId);
        return userInfo;
    }
}

  1. 啟動項目,打開http://localhost:8080/swagger-ui.html
    接口調(diào)試

    第一次執(zhí)行后,查看控制臺輸出的信息:
  • CacheManager已經(jīng)是EhCacheCacheManager
  • 有sql查詢信息


    第一次查詢結(jié)果

    繼續(xù)查詢一次或者多查幾次,后邊幾次都沒有出現(xiàn)sql查詢信息,返回的結(jié)果來自緩存


    繼續(xù)查詢接口

    返回結(jié)果

總結(jié)

EhCache的使用也是比較簡單的,使用也比較廣泛这溅,通過上邊的例子和之前的Redis操作,大家應(yīng)該已經(jīng)熟悉了緩存操作這個環(huán)節(jié),以后在項目中應(yīng)用起來應(yīng)該是得心應(yīng)手了组民。

項目地址

https://gitee.com/kaixinshow/springboot-note

返回【Spring Boot學(xué)習(xí)】目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悲靴,隨后出現(xiàn)的幾起案子臭胜,更是在濱河造成了極大的恐慌,老刑警劉巖癞尚,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庇楞,死亡現(xiàn)場離奇詭異,居然都是意外死亡否纬,警方通過查閱死者的電腦和手機吕晌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門宙帝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辖佣,“玉大人勾怒,你說我怎么就攤上這事锯梁£羌茫” “怎么了泳叠?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵决记,是天一觀的道長美莫。 經(jīng)常有香客問我爪瓜,道長蹬跃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任铆铆,我火速辦了婚禮蝶缀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄货。我一直安慰自己翁都,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布谅猾。 她就那樣靜靜地躺著柄慰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪税娜。 梳的紋絲不亂的頭發(fā)上坐搔,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音敬矩,去河邊找鬼概行。 笑死,一個胖子當(dāng)著我的面吹牛谤绳,可吹牛的內(nèi)容都是我干的占锯。 我是一名探鬼主播袒哥,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼消略!你這毒婦竟也來了堡称?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤艺演,失蹤者是張志新(化名)和其女友劉穎却紧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胎撤,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡晓殊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伤提。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫俺。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肿男,靈堂內(nèi)的尸體忽然破棺而出介汹,到底是詐尸還是另有隱情,我是刑警寧澤舶沛,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布嘹承,位于F島的核電站,受9級特大地震影響如庭,放射性物質(zhì)發(fā)生泄漏叹卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一坪它、第九天 我趴在偏房一處隱蔽的房頂上張望骤竹。 院中可真熱鬧,春花似錦哟楷、人聲如沸瘤载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墨技,卻和暖如春惩阶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扣汪。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工断楷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崭别。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓冬筒,卻偏偏與公主長得像恐锣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舞痰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361