1. 程式人生 > >SpringBoot+SpringDataJPA使用Ehcache快取

SpringBoot+SpringDataJPA使用Ehcache快取

首先介紹一下驗證快取生效的方法:

(1) show-sql屬性設定為true, 執行多次查詢, 看控制檯只打印一次sql(生效),還是每一次查詢都會列印(未生效)

(2)專案啟動後,第一次查詢完畢後,修改資料庫中的值然後再次查詢,看查詢出的值是修改前的(生效),還是修改後的(未生效), 由此也可知道查詢頻繁,時效性高的資料是不能使用快取的。

pom.xml中添加了如下兩個依賴,是否使用上還未具體驗證:

        <!--Ehcache-core 包 -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.9</version>
        </dependency>
        <!--新增Hibernate-Ehcache包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>5.2.16.Final</version>
        </dependency>

1. SpringBoot啟動類上面一定要加@EnableCaching註解

@EnableCaching
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
2. 在Spring Data JPA的持久層介面上新增@CacheConfig(cacheNames = "weather")註解

3. 在Spring Data JPA的持久層介面需要新增快取的方法上新增@Cacheable

(cacheNames = {"weather","hehehe"})註解

注意: 第2條和第3條中, 如果在方法上添加了註解, 則就不必在介面上添加註解了, 但是

如果僅僅添加註解而不給出屬性則會出現以下異常

java.lang.IllegalStateException: No cache could be resolved for 'Builder[public abstract java.util.List com.test.findByXXX()] caches=[] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'' using resolver '
[email protected]
ed'. At least one cache should be provided per cache operation.

給方法或介面的註解上新增cacheNames後快取正常使用,不再報錯

@Cacheable(cacheNames = {"weather","hehehe"})

總之就是介面上的註解或者方法上的註解至少要有一個給出 cacheNames屬性, 具體作用暫時沒有深究, 另外附上一個網上的ehcache.xml配置檔案, 我把檔案內容全部註釋掉了, 快取也是可以生效的

目測是根據 cacheNames的值 與 ehcache.xml配置檔案裡的<cache name="">屬性進行匹配對應

<ehcache>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
    />
    <cache name="weather"
           maxElementsInMemory="2000"
           eternal="false"
           timeToIdleSeconds="18000"
           timeToLiveSeconds="36000"
           overflowToDisk="false"
    />
</ehcache>

----------------------------------------------------------------------------------------------------------------------------------

在開發中,如果相同的查詢條件去頻繁查詢資料庫, 是不是會給資料庫帶來很大的壓力呢?
因此,我們需要對查詢出來的資料進行快取,這樣客戶端只需要從資料庫查詢一次資料,然後會放入快取中,以後再次查詢時可以從快取中讀取。
Spring3開始提供了強大的基於註解的快取支援,可以通過註解配置方式低侵入的給原有Spring應用增加快取功能,提高資料訪問效能。

具體在Springboot中使用快取如下:

1.在pom.xml中引入cache依賴,新增如下內容:

<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.在資料訪問介面中,增加快取配置註解,如:

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

SpringBoot支援很多種快取方式:redis、guava、ehcahe、jcache等等。

 說明下redis和ehcache的區別:

Redis:屬於獨立的執行程式,需要單獨安裝後,使用Java中的Jedis來操縱。因為它是獨立,所以如果你寫個單元測試程式,放一些資料在Redis中,然後又寫一個程式去拿資料,那麼是可以拿到這個資料的。,
ehcache:與Redis明顯不同,它與java程式是綁在一起的,java程式活著,它就活著。譬如,寫一個獨立程式放資料,再寫一個獨立程式拿資料,那麼是拿不到資料的。只能在獨立程式中才能拿到資料。

如果使用Ehcache,只需要在工程中加入ehcache.xml配置檔案並在pom.xml中增加ehcache依賴,框架只要發現該檔案,就會建立EhCache的快取管理器。

1、在src/main/resources目錄下建立: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"):配置了該資料訪問物件中返回的內容將儲存於名為users的快取物件中,我們也可以不使用該註解,直接通過@Cacheable自己配置快取集的名字來定義。

  • @Cacheable:配置了findByName函式的返回值將被加入快取。同時在查詢時,會先從快取中獲取,若不存在才再發起對資料庫的訪問。該註解主要有下面幾個引數:

    • valuecacheNames:兩個等同的引數(cacheNames為Spring 4新增,作為value的別名),用於指定快取儲存的集合名。由於Spring 4中新增了@CacheConfig,因此在Spring 3中原本必須有的value屬性,也成為非必需項了
    • key:快取物件儲存在Map集合中的key值,非必需,預設按照函式的所有引數組合作為key值,若自己配置需使用SpEL表示式,比如:@Cacheable(key = "#p0"):使用函式第一個引數作為快取的key值,更多關於SpEL表示式的詳細內容可參考官方文件
    • condition:快取物件的條件,非必需,也需使用SpEL表示式,只有滿足表示式條件的內容才會被快取,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有當第一個引數的長度小於3的時候才會被快取,若做此配置上面的AAA使用者就不會被快取,讀者可自行實驗嘗試。
    • unless:另外一個快取條件引數,非必需,需使用SpEL表示式。它不同於condition引數的地方在於它的判斷時機,該條件是在函式被呼叫之後才做判斷的,所以它可以通過對result進行判斷。
    • keyGenerator:用於指定key生成器,非必需。若需要指定一個自定義的key生成器,我們需要去實現org.springframework.cache.interceptor.KeyGenerator介面,並使用該引數來指定。需要注意的是:該引數與key是互斥的
    • cacheManager:用於指定使用哪個快取管理器,非必需。只有當有多個時才需要使用
    • cacheResolver:用於指定使用那個快取解析器,非必需。需通過org.springframework.cache.interceptor.CacheResolver介面來實現自己的快取解析器,並用該引數指定。

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

  • @CachePut:配置於函式上,能夠根據引數定義條件來進行快取,它與@Cacheable不同的是,它每次都會真是呼叫函式,所以主要用於資料新增和修改操作上。它的引數與@Cacheable類似,具體功能可參考上面對@Cacheable引數的解析
  • @CacheEvict:配置於函式上,通常用在刪除方法上,用來從快取中移除相應資料。除了同@Cacheable一樣的引數之外,它還有下面兩個引數:
    • allEntries:非必需,預設為false。當為true時,會移除所有資料
    • beforeInvocation:非必需,預設為false,會在呼叫方法之後移除資料。當為true時,會在呼叫方法之前移除資料。

相關推薦

springboot快取

1.springboot 整合 ehcache 1.1  引入pom依賴 <!-- caching --> <dependency> <groupId>org.springframework.boot</groupId>

20181021-SpringBoot使用快取

*使用java自帶的ehcache做快取  一、導包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo

關於springboot使用快取機制的方法

EhCache 的優缺點 優點: 快速,簡單,多種快取策略 快取資料有兩級:記憶體和磁碟,因此無需擔心容量問題 快取資料會在虛擬機器重啟的過程中寫入磁碟 可以通過RMI、可插入API等方式進行分散式快取 具有快取和快取管理器的偵聽介面 支援多快取

SpringBoot快取@EnableCaching

很多時候系統的瓶頸都在一些比較複雜的IO操作,例如讀取資料庫,如果一些比較穩定的資料,一般的解決方案就是用快取。spring boot提供了比較簡單的快取方案。只要使用 @EnableCaching即可完成簡單的快取功能。 快取的實現有多種實現,ConcurentHashMapCache , G

帶著新人學springboot的應用01(springboot+mybatis+快取 中)

  繼續接著上一節,大家應該知道駝峰命名法吧!就是我們javabean中屬性一般命名是lastName,userName這種型別的,而資料庫中列名一般都是last_name,user_name這種的,要讓對應起來,在springboot中可以設定      另外大家可以看看我們用了mybatis依賴之

springboot + ehcache快取

springboot + ehcache快取 1. 載入依賴包 <!-- caching --> <dependency> <groupId>org.springframework.boot</groupId>

springboot快取技術(轉)

springboot的快取技術   引子 我門知道一個程式的瓶頸在於資料庫,我門也知道記憶體的速度是大大快於硬碟的速度的。當我門需要重複的獲取相同的資料的時候,我門一次又一次的請求資料庫或者遠端服務,導致大量的時間耗費在資料庫查詢或者遠端方法的呼叫上,導致程式效能的惡化,這更是

SpringBoot快取的支援

頁面快取是否有必要?      幾乎所有的網站的首頁都是訪問率最高的,而首頁上的資料來源又是非常廣泛的,大多數來自不同的物件,而且有可能來自不同的db ,所以給首頁做快取是很必要的。那麼主頁的快取策略應該怎樣設計呢?我認為應該是某個固定時間之內不變的,比如

springboot快取—使用、原理、整合redis

      Java快取介面標準JSR-107:Java Caching定義了5個核心介面,分別是CachingProvider(快取提供者), CacheManager(快取管理器), Cache(快取元件), Entry (key-value對)和Expiry(條目有效期

SpringBoot使用快取及原理

一.JSR107 Java Caching 定義了五個核心介面,分別是CachingProvider,CacheManager,Cache,Entry和Expiry。 CachingProvider  定義了建立、配置、獲取、管理和控制多個CacheManager。一

springboot整合快取redis-cache

1、pom新增必要的redis、cache、common依賴 <!--cache 依賴包--> <dependency> <groupId>org.springframework.boot<

三、springboot-redis快取使用

一、建立springboot專案 二、pom.xml新增以下依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifa

Springboot應用快取實踐之:Ehcache加持

本文共 851字,閱讀大約需要 3分鐘 ! 本文內容腦圖如下: 概述 在如今高併發的網際網路應用中,快取的地位舉足輕重,對提升程式效能幫助不小。而3.x開始的 Spring也引入了對 Cache的支援,那對於如今發展得如火如荼的 Spring Boo

springboot使用快取cache

springboot使用快取cache 1.引入jar包 <!-- Springboot中開啟快取 --> <dependency> <groupId>org.springframework.boot</groupId>

springboot~hazelcast快取中介軟體

快取來了 在dotnet平臺有自己的快取框架,在java springboot裡當然了集成了很多,而且快取的中介軟體也可以進行多種選擇,向redis, hazelcast都是分散式的快取中介軟體,今天主要說一下後者的實現。 新增依賴包 dependencies { compile("org.sprin

第一篇:SpringBoot高階-快取入門

JSR107 Java Caching定義了5個核心介面,分別是CachingProvider, CacheManager, Cache, Entry和Expiry。 CachingProvider定義了建立、配置、獲取、管理和控制多個 CacheMana

SpringBoot快取

1、引入jar包    <!--快取--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s

帶著新人學springboot的應用01(springboot+mybatis+快取 上)

  上一篇結束,第一次做一個這麼長的系列,很多東西我也是沒有說到,也許是還沒有想到,哈哈哈,不過基本的東西還是說的差不多了的。假如以後碰到了不會的,隨便查查資料配置一下就ok。   咳,還有大家如果把我前面的消化的差不多的話,那麼應該從萌新成長到新人了,嘿嘿!所以我把這一篇題目叫做帶著新人學@[email&#

springboot快取技術

引子 我門知道一個程式的瓶頸在於資料庫,我門也知道記憶體的速度是大大快於硬碟的速度的。當我門需要重複的獲取相同的資料的時候,我門一次又一次的請求資料庫或者遠端服務,導致大量的時間耗費在資料庫查詢或者遠端方法的呼叫上,導致程式效能的惡化,這更是資料快取要解決的問

SpringBoot快取

Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager介面來統一不同的快取技術,並支援使用JCache(JSR-107)註解簡化我們開發; Ca