SpringBoot2 整合Ehcache元件,輕量級快取管理

知了一笑發表於2020-08-09

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、Ehcache快取簡介

1、基礎簡介

EhCache是一個純Java的程式內快取框架,具有快速、上手簡單等特點,是Hibernate中預設的快取提供方。

2、Hibernate快取

Hibernate三級快取機制簡介:

一級快取:基於Session級別分配一塊快取空間,快取訪問的物件資訊。Session關閉後會自動清除快取。

二級快取:是SessionFactory物件快取,可以被建立出的多個 Session 物件共享,二級快取預設是關閉的,如果要使用需要手動開啟,並且依賴EhCache元件。

三級快取:查詢快取,配置開啟該快取的情況下,重複使用一個sql查詢某個範圍內的資料,會進行快取。

3、EhCache快取特點

  • 快速,簡單,並且提供多種快取策略;
  • 快取資料有兩級:記憶體和磁碟,無需擔心容量問題;
  • 快取資料會在虛擬機器重啟的過程中寫入磁碟;
  • 可以通過RMI、可插入API等方式進行分散式快取;
  • 具有快取和快取管理器的偵聽介面;
  • 支援多快取管理器例項,以及一個例項的多個快取區域;
  • 提供Hibernate的快取實現;

4、對比Redis快取

Ehcache:直接在Jvm虛擬機器中快取,速度快,效率高,不適合處理大規模快取資料,在分散式環境下,快取資料共享操作複雜;

Redis:作為獨立的快取中介軟體,在分散式快取系統中非常好用,快取資料共享,有效支撐大量資料快取,支援哨兵模式,或者叢集模式的高可用成熟方案;

二、整合SpringBoot框架

1、核心依賴

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

2、載入配置

基礎配置

spring:
  cache:
    ehcache:
      config: classpath:ehcache.xml

啟動類註解

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

3、配置詳解

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <!-- 作業系統快取的臨時目錄,記憶體滿後寫入該目錄 -->
    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>

    <cache name="userEntity"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"
           maxElementsOnDisk="10000000"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>
</ehcache>

配置引數說明

maxElementsOnDisk:磁碟快取中最多可以存放的元素數量;

eternal:快取中物件是否永久有效;

timeToIdleSeconds:當eternal=false時使用,快取資料有效期(單位:秒),時間段內沒有訪問該元素,將被清除;

timeToLiveSeconds:快取資料的存活時間;

maxElementsInMemory:記憶體中最多可以存放的元素數量,overflowToDisk=true,則會將Cache中多出的元素放入磁碟檔案中,若overflowToDisk=false,則根據memoryStoreEvictionPolicy策略替換Cache中原有的元素;

diskExpiryThreadIntervalSeconds:磁碟快取的清理執行緒執行間隔;

memoryStoreEvictionPolicy:快取釋放策略,LRU會優先清理最少使用的快取;

localTempSwap:持久化策略,當堆記憶體或者非堆記憶體裡面的元素已經滿了的時候,將其中的元素臨時的存放在磁碟上,重啟後就會消失;

三、註解用法

@Service
public class CacheService {

    private static final Logger LOGGER = LoggerFactory.getLogger(CacheService.class);

    @Resource
    private UserMapper userMapper ;

    @Cacheable(value="userEntity")  // 在快取有效期內,首次查詢才訪問資料庫
    public UserEntity getById (Integer id){
        // 通過日誌,標識方法是否執行
        LOGGER.info("getById..."+id);
        return userMapper.selectById(id) ;
    }

    @CacheEvict(value="userEntity",key = "#id") //該ID資料更新,清空該ID快取
    public void updateUser(Integer id) {
        UserEntity user = new UserEntity() ;
        user.setId(id);
        user.setUserName("myCache");
        userMapper.updateById(user);
    }
}

@Cacheable:註解標記在一個方法上,也可以標記在一個類上,標記在一個方法上表示該方法支援快取,該方法被呼叫後將其返回值快取起來,下次同樣的請求引數執行該方法時可以直接從快取中獲取結果,而不需要再次執行該方法。

@CacheEvict:註解標記在需要清除快取元素的方法或類上的,當標記在一個類上時表示其中所有的方法的執行都會觸發快取的清除操作,並且可以按照指定屬性清除。

四、原始碼地址

GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

推薦閱讀:SpringBoot進階系列

序號 文章標題
01 Boot2 整合 shard-jdbc 中介軟體,實現資料分庫分表
02 Boot2 整合 JavaMail ,實現非同步傳送郵件功能
03 Boot2 整合 RocketMQ ,實現請求非同步處理
04 Boot2 整合 Swagger2 ,構建介面管理介面
05 Boot2 整合 QuartJob ,實現定時器實時管理
06 Boot2 整合 Redis叢集 ,實現訊息佇列場景
07 Boot2 整合 Dubbo框架 ,實現RPC服務遠端呼叫
08 Boot2 整合 ElasticSearch框架,實現高效能搜尋引擎
09 Boot2 整合 JWT 框架,解決Token跨域驗證問題
10 Boot2 整合 FastDFS 中介軟體,實現檔案分佈管理
11 Boot2 整合 Shiro 框架,實現使用者許可權管理
12 Boot2 整合 Security 框架,實現使用者許可權管理
13 Boot2 整合 ClickHouse資料庫,實現資料高效能查詢分析
14 Boot2 整合 Drools規則引擎,實現高效的業務規則
15 Boot2 整合 多資料來源,配置MybatisPlus增強外掛
16 Boot2 整合 Zookeeper元件,管理架構中服務協調
17 Boot2 整合Nacos元件,環境搭建和入門案例詳解
18 檔案系統(01):基於Boot2框架,管理Excel和PDF
18 檔案系統(02):基於Boot2框架,管理Xml和CSV
19 Boot2 整合 Kafka元件,應用案例和流程詳解
20 Boot2 整合 ElasticJob框架,定製化管理流程
21 Boot2 整合JTA元件,多資料來源事務管理
22 Boot2 整合FreeMarker模板,完成頁面靜態化處理
23 Boot2 整合MinIO中介軟體,實現檔案便捷管理

相關文章