溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot2整合Ehcache組件,輕量級緩存管理的案例分析

發(fā)布時間:2020-08-12 15:56:03 來源:億速云 閱讀:202 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)SpringBoot2整合Ehcache組件,輕量級緩存管理的案例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、Ehcache緩存簡介

1、基礎(chǔ)簡介

EhCache是一個純Java的進(jìn)程內(nèi)緩存框架,具有快速、上手簡單等特點(diǎn),是Hibernate中默認(rèn)的緩存提供方。

2、Hibernate緩存

Hibernate三級緩存機(jī)制簡介:

一級緩存:基于Session級別分配一塊緩存空間,緩存訪問的對象信息。Session關(guān)閉后會自動清除緩存。

二級緩存:是SessionFactory對象緩存,可以被創(chuàng)建出的多個 Session 對象共享,二級緩存默認(rèn)是關(guān)閉的,如果要使用需要手動開啟,并且依賴EhCache組件。

三級緩存:查詢緩存,配置開啟該緩存的情況下,重復(fù)使用一個sql查詢某個范圍內(nèi)的數(shù)據(jù),會進(jìn)行緩存。

3、EhCache緩存特點(diǎn)

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

4、對比Redis緩存

Ehcache:直接在Jvm虛擬機(jī)中緩存,速度快,效率高,不適合處理大規(guī)模緩存數(shù)據(jù),在分布式環(huán)境下,緩存數(shù)據(jù)共享操作復(fù)雜;

Redis:作為獨(dú)立的緩存中間件,在分布式緩存系統(tǒng)中非常好用,緩存數(shù)據(jù)共享,有效支撐大量數(shù)據(jù)緩存,支持哨兵模式,或者集群模式的高可用成熟方案;

二、集成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、加載配置

基礎(chǔ)配置

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">

 <!-- 操作系統(tǒng)緩存的臨時目錄,內(nèi)存滿后寫入該目錄 -->
 <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>

配置參數(shù)說明

maxElementsOnDisk:磁盤緩存中最多可以存放的元素數(shù)量;

eternal:緩存中對象是否永久有效;

timeToIdleSeconds:當(dāng)eternal=false時使用,緩存數(shù)據(jù)有效期(單位:秒),時間段內(nèi)沒有訪問該元素,將被清除;

timeToLiveSeconds:緩存數(shù)據(jù)的存活時間;

maxElementsInMemory:內(nèi)存中最多可以存放的元素數(shù)量,overflowToDisk=true,則會將Cache中多出的元素放入磁盤文件中,若overflowToDisk=false,則根據(jù)memoryStoreEvictionPolicy策略替換Cache中原有的元素;

diskExpiryThreadIntervalSeconds:磁盤緩存的清理線程運(yùn)行間隔;

memoryStoreEvictionPolicy:緩存釋放策略,LRU會優(yōu)先清理最少使用的緩存;

localTempSwap:持久化策略,當(dāng)堆內(nèi)存或者非堆內(nèi)存里面的元素已經(jīng)滿了的時候,將其中的元素臨時的存放在磁盤上,重啟后就會消失;

三、注解用法

@Service
public class CacheService {

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

 @Resource
 private UserMapper userMapper ;

 @Cacheable(value="userEntity") // 在緩存有效期內(nèi),首次查詢才訪問數(shù)據(jù)庫
 public UserEntity getById (Integer id){
  // 通過日志,標(biāo)識方法是否執(zhí)行
  LOGGER.info("getById..."+id);
  return userMapper.selectById(id) ;
 }

 @CacheEvict(value="userEntity",key = "#id") //該ID數(shù)據(jù)更新,清空該ID緩存
 public void updateUser(Integer id) {
  UserEntity user = new UserEntity() ;
  user.setId(id);
  user.setUserName("myCache");
  userMapper.updateById(user);
 }
}

@Cacheable:注解標(biāo)記在一個方法上,也可以標(biāo)記在一個類上,標(biāo)記在一個方法上表示該方法支持緩存,該方法被調(diào)用后將其返回值緩存起來,下次同樣的請求參數(shù)執(zhí)行該方法時可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法。

@CacheEvict:注解標(biāo)記在需要清除緩存元素的方法或類上的,當(dāng)標(biāo)記在一個類上時表示其中所有的方法的執(zhí)行都會觸發(fā)緩存的清除操作,并且可以按照指定屬性清除。

關(guān)于SpringBoot2整合Ehcache組件,輕量級緩存管理的案例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI