1. 程式人生 > >SpringBoot系列(7)---SpringBoot-Cache(EhCache)

SpringBoot系列(7)---SpringBoot-Cache(EhCache)

SpringBoot提供資料快取的功能,相信非常多人已經用過cache了。因為資料庫的IO瓶頸應該大家也吃過不少虧了,所以一般情況下我們都會引入非常多的快取策略,例如引入redis,引入hibernate的二級快取等等。

SpringBoot在annotation的層面給我們實現了cache,當然這也是得益於Spring的AOP。所有的快取配置只是在annotation層面配置,完全沒有侵入到我們的程式碼當中,就像我們的宣告式事務一樣。

Spring定義了CacheManager和Cache介面統一不同的快取技術。其中CacheManager是Spring提供的各種快取技術的抽象介面。而Cache介面包含快取的各種操作,當然我們一般情況下不會直接操作Cache介面。

Spring針對不同的快取技術,需要實現不同的cacheManager,Spring定義瞭如下的cacheManger實現

CacheManger 描述
SimpleCacheManager 使用簡單的Collection來儲存快取,主要用於測試
ConcurrentMapCacheManager 使用ConcurrentMap作為快取技術(預設)
NoOpCacheManager 測試用
EhCacheCacheManager 使用EhCache作為快取技術,以前在hibernate的時候經常用
GuavaCacheManager 使用google guava的GuavaCache作為快取技術
HazelcastCacheManager 使用Hazelcast作為快取技術
JCacheCacheManager 使用JCache標準的實現作為快取技術,如Apache Commons JCS
RedisCacheManager 使用Redis作為快取技術

當然常規的SpringBoot已經為我們自動配置了EhCache、Collection、Guava、ConcurrentMap等快取,預設使用SimpleCacheConfiguration,即使用ConcurrentMapCacheManager。SpringBoot的application.properties配置檔案,使用spring.cache字首的屬性進行配置。

spring.cache.type=#快取的技術型別
spring.cache.cache-names=應用程式啟動建立快取的名稱
spring.cache.ehcache.config=ehcache的配置檔案位置
spring.cache.infinispan.config=infinispan的配置檔案位置
spring.cache.jcache.config=jcache配置檔案位置
spring.cache.jcache.provider=當多個jcache實現類時,指定選擇jcache的實現類

在SpringBoot環境下我們需要匯入相關快取技術的依賴,並在配置類當中配置@EnableCaching開啟快取技術。

我們這裡不適用預設的ConcurrentMapCache 而是使用 EhCache

所以我在resources目錄下建立了ehcache.xml的配置檔案,然後在application.properties 設定type為ehcache(intellij有明確的提示):

ehcache.xml:

<ehcache>
<!-- 指定一個檔案目錄,當EHCache把資料寫到硬碟上時,將把資料寫到這個檔案目錄下 -->
<diskStore path="java.io.tmpdir"/>
<!-- 設定快取的預設資料過期策略 -->
<cache name="weibo" maxElementsInMemory="10000" />    <defaultCache
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="10"
timeToLiveSeconds="120"
diskPersistent="false"
memoryStoreEvictionPolicy="LRU"
diskExpiryThreadIntervalSeconds="120"/>
<!-- maxElementsInMemory 記憶體中最大快取物件數,看著自己的heap大小來搞 -->
    <!-- eternal:true表示物件永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false -->
    <!-- maxElementsOnDisk:硬碟中最大快取物件數,若是0表示無窮大 -->
    <!-- overflowToDisk:true表示當記憶體快取的物件數目達到了maxElementsInMemory界限後,
    會把溢位的物件寫到硬碟快取中。注意:如果快取的物件要寫入到硬碟中的話,則該物件必須實現了Serializable接口才行。-->
    <!-- diskSpoolBufferSizeMB:磁碟快取區大小,預設為30MB。每個Cache都應該有自己的一個快取區。-->
    <!-- diskPersistent:是否快取虛擬機器重啟期資料  -->
    <!-- diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔,預設為120秒 -->
    <!-- timeToIdleSeconds: 設定允許物件處於空閒狀態的最長時間,以秒為單位。當物件自從最近一次被訪問後,
    如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個物件就會過期,
    EHCache將把它從快取中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,
    則表示物件可以無限期地處於空閒狀態 -->
    <!-- timeToLiveSeconds:設定物件允許存在於快取中的最長時間,以秒為單位。當物件自從被存放到快取中後,
    如果處於快取中的時間超過了 timeToLiveSeconds屬性值,這個物件就會過期,
    EHCache將把它從快取中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,
    則表示物件可以無限期地存在於快取中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義 -->
    <!-- memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,
    Ehcache將會根據指定的策略去清理記憶體。可選策略有:LRU(最近最少使用,預設策略)、
    FIFO(先進先出)、LFU(最少訪問次數)。-->
</ehcache>

application.properties:

spring.cache.type=ehcache
spring.cache.ehcache.config=ehcache.xml
在配置類配置@EnableCaching
@SpringBootApplication
@EnableCaching
public class DemoApplication extends WebMvcConfigurerAdapter {

然後說說4個annotation的配置:

@Cacheable  在方法執行前Spring先是否有快取資料,如果有直接返回。如果沒有資料,呼叫方法並將方法返回值存放在快取當中。

@CachePut   無論怎樣,都將方法的範湖值放到快取當中。

@CacheEvict   將一條或者多條資料從快取中刪除。

@Caching  可以通過@Caching註解組合多個註解集合在一個方法上

使用演示JPA時候的方法進行快取測試:

@Transactional
@CachePut(value = "weibo",key="#weibo.weiboId")
public Weibo saveWeibo(Weibo weibo){
    this.weiboRepository.save(weibo);
    return weibo;
}

@Cacheable(value = "weibo")
public Weibo getWeiboById(long id){
    return this.weiboRepository.getByWeiboId(id);
}


@Transactional
@CacheEvict(value = "weibo",key = "#weibo.weiboId")
public void remove(Weibo weibo){
    this.weiboRepository.delete(weibo);
}

當然如果我們想單獨配置一下weibo這個快取可以通過ehcache.xml進行單獨配置,不過需要提醒的是 maxElementsInMemory屬性配置是必須的,否則無法啟動SpringBoot應用。

<cache name="weibo" maxElementsInMemory="10000" overflowToDisk="false" timeToIdleSeconds="60"  timeToLiveSeconds="120" />

通過Controller進行測試,快取生效:

@RestController
@RequestMapping("/cache")
public class CacheTestController {

    @Autowired
private WeiboService weiboService;
@Autowired
private UserRepository userRepository;
@RequestMapping("/getWeibo/{id}")
    public Weibo getWeibo(@PathVariable("id") long id){
        return weiboService.getWeiboById(id);
}

    @RequestMapping("/addWeibo")
    public Weibo addWeibo(String username,String weiboText){
        User user = userRepository.getByUsernameIs(username);
Weibo weibo = new Weibo(user,weiboText,new Date(System.currentTimeMillis()));
        return this.weiboService.saveWeibo(weibo);
}

    @RequestMapping("/delete/{id}")
    public Weibo delete(@PathVariable("id") long id){
        Weibo weibo = this.weiboService.getWeiboById(id);
        this.weiboService.remove(weibo);
        return weibo;
}
}

相關推薦

SpringBoot系列(7)---SpringBoot-Cache(EhCache)

SpringBoot提供資料快取的功能,相信非常多人已經用過cache了。因為資料庫的IO瓶頸應該大家也吃過不少虧了,所以一般情況下我們都會引入非常多的快取策略,例如引入redis,引入hibernate的二級快取等等。 SpringBoot在annotation的層面給我

SpringBoot系列7-SpringBoot+mybatis+druid+TypeHandler

介紹在SpringBoot中整合mybatis和druid以及自定義TypeHandler 建立資料庫表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------------

SpringBoot系列SpringBoot註解詳解

一、註解(annotations)列表  @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。其中@ComponentScan讓Spring Boot掃描到Con

SpringBoot系列springboot整合Redis

引入依賴: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

SpringBoot系列springboot靜態變數注入

【場景】 配置檔案中的配置項的讀取,例如:defaultTimes=3 【變數獲取】 1.一般變數獲取 @Value("${defaultTimes}") private String defaultTimes; 2.靜態變數獲取 @Component public cl

SpringBoot系列SpringBoot打包成war,並在tomcat下執行

1、實現繼承SpringBootServletInitializer類package com.example.demo; import org.springframework.boot.builder.SpringApplicationBuilder; import org

Springboot系列Springboot與Mybatis整合

前言 技術部落格那麼多,為什麼自己整理呢?太過零散的知識點不易記憶,且查詢的時候也不是太方便,眼過千遍不如手過一遍的操作一遍,即使Springboot已經很好的整合了各項的技術框架,但實際操作的時候也會發現一些問題。我會將可能出現的問題記錄一下,博文時刻更新。 預備知識: Springboot 2.0.6

Springboot系列Springboot的郵件服務

前言 Springboot集常用的功能於一體,當然郵件功能作為最常見的功能,自然不能缺席Springboot的大家庭,spring-boot-starter-mail這個jar裡面封裝了SpringBoot的郵件功能。下面來看一下常見的郵件用途 預備知識: Springboot 2.1.1 Maven 3

SpringBoot 系列-3 SpringBoot 第一個Controller

註解這塊與springmvc都是一樣的 我們看一個簡單點例子。 package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.a

SpringBoot 系列-2 SpringBoot demo

spring官方提供一個demo  https://start.spring.io/ 可以選擇你的構建工具、版本、Group、Artifact 等資訊。 點選generate之後會下載一個zip包。 本文以eclipse 和  maven 作為工作, 匯入zip

Springboot系列Springboot與Thymeleaf模板引擎整合基礎教程(附原始碼)

前言 由於在開發My Blog專案時使用了大量的技術整合,針對於部分框架的使用和整合的流程沒有做詳細的介紹和記錄,導致有些朋友用起來有些吃力,因此打算在接下來的時間裡做一些基礎整合的介紹,當然,可能也不會特別的基礎,但是原始碼會開放給大家,方便大家學習,此次的原始碼地址為s

SpringCloud系列——SSO 單點登入 SpringCloud系列——Zuul 動態路由 SpringBoot系列——Redis SpringBoot系列——Redis

  前言   作為分散式專案,單點登入是必不可少的,文字基於之前的的部落格(猛戳:SpringCloud系列——Zuul 動態路由,SpringBoot系列——Redis)記錄Zuul配合Redis實現一個簡單的sso單點登入例項   sso單點登入思路:   1、訪問分散式系統的任意請求,被Zuul的

SpringBoot系列(6)---SpringBoot-JPA

JPA 應該都熟悉了,我就不多說了什麼是JPA了。目前JPA主要實現由hibernate和openJPA等。Spring Data JPA 是Spring Data 的一個子專案,它通過提供基於JPA的Repository極大了減少了操作JPA的程式碼。筆者覺得這個由Spri

-SpringBoot-Cache(EhCache)

SpringBoot提供資料快取的功能,相信非常多人已經用過cache了。因為資料庫的IO瓶頸應該大家也吃過不少虧了,所以一般情況下我們都會引入非常多的快取策略,例如引入redis,引入hibernate的二級快取等等。SpringBoot在annotation的層面給我們實現

SpringBoot系列—docker安裝使用(windows 7

Docker概述 Docker是一個輕量級容器技術,類似於虛擬機器技術。docker是直接執行在當前作業系統(linux)之上,而不是虛擬機器中,但是也實現了虛擬機器技術的資源隔離,效能遠遠高於虛擬機

補習系列(21)-SpringBoot初始化之7招式

目錄 背景 1、 @PostConstruct 註解 2、 InitializingBean 介面 3、 @Bean initMethod方法 4、 構造器注入 5、 Appl

SpringBoot系列:Spring Boot整合Spring Cache

一、關於Spring Cache 快取在現在的應用中越來越重要, Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager介面來統一不同的快取技術,並支援使用JCache(JSR-107)註解簡化

springBoot7):web開發-錯誤處理

spring boot 錯誤處理 處理方式一:實現ErrorController接口原理:Spring Boot 將所有的錯誤默認映射到/error, 實現ErrorController接口代碼:package com.example.demo.controller; import org.sp

[springBoot系列]--springBoot註解大全

歸類 onetoone rod gif 示例 nts 描述符 控制 負責 一、註解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfigurati

SpringBoot系列二:搭建自己的第一個SpringBoot程序

快速 oot local 程序 源代碼 參考 xmlns 技術 don 一、根據官網手工搭建(http://projects.spring.io/spring-boot/#quick-start) 1、新建一個maven工程springbootfirst 2、 如果要想開