您好,登錄后才能下訂單哦!
SpringBoot在annotation的層面實(shí)現(xiàn)了數(shù)據(jù)緩存的功能,基于Spring的AOP技術(shù)。所有的緩存配置只是在annotation層面配置,像聲明式事務(wù)一樣。
Spring定義了CacheManager和Cache接口統(tǒng)一不同的緩存技術(shù)。其中CacheManager是Spring提供的各種緩存技術(shù)的抽象接口。而Cache接口包含緩存的各種操作。
CacheManger
針對(duì)不同的緩存技術(shù),需要實(shí)現(xiàn)不同的cacheManager,Spring定義了如下的cacheManger實(shí)現(xiàn)。
CacheManger | 描述 |
---|---|
SimpleCacheManager | 使用簡(jiǎn)單的Collection來存儲(chǔ)緩存,主要用于測(cè)試 |
ConcurrentMapCacheManager | 使用ConcurrentMap作為緩存技術(shù)(默認(rèn)) |
NoOpCacheManager | 測(cè)試用 |
EhCacheCacheManager | 使用EhCache作為緩存技術(shù),以前在hibernate的時(shí)候經(jīng)常用 |
GuavaCacheManager | 使用google guava的GuavaCache作為緩存技術(shù) |
HazelcastCacheManager | 使用Hazelcast作為緩存技術(shù) |
JCacheCacheManager | 使用JCache標(biāo)準(zhǔn)的實(shí)現(xiàn)作為緩存技術(shù),如Apache Commons JCS |
RedisCacheManager | 使用Redis作為緩存技術(shù) |
常規(guī)的SpringBoot已經(jīng)為我們自動(dòng)配置了EhCache、Collection、Guava、ConcurrentMap等緩存,默認(rèn)使用ConcurrentMapCacheManager。SpringBoot的application.properties配置文件,使用spring.cache前綴的屬性進(jìn)行配置。
application配置
spring.cache.type=#緩存的技術(shù)類型 spring.cache.cache-names=應(yīng)用程序啟動(dòng)創(chuàng)建緩存的名稱 spring.cache.ehcache.config=ehcache的配置文件位置 spring.cache.infinispan.config=infinispan的配置文件位置 spring.cache.jcache.config=jcache配置文件位置 spring.cache.jcache.provider=當(dāng)多個(gè)jcache實(shí)現(xiàn)類時(shí),指定選擇jcache的實(shí)現(xiàn)類
入口類配置
加入注解 @EnableCaching
緩存注解
注解 | 描述 |
---|---|
@Cacheable | 在調(diào)用方法之前,首先應(yīng)該在緩存中查找方法的返回值,如果這個(gè)值能夠找到,就會(huì)返回緩存的值。否則,這個(gè)方法就會(huì)被調(diào)用,返回值會(huì)放到緩存之中。 |
@CachePut | 將方法的返回值放到緩存中。在方法的調(diào)用前并不會(huì)檢查緩存,方法始終都會(huì)被調(diào)用。 |
@CacheEvict | 在緩存中清除一個(gè)或多個(gè)條目。 |
@Caching | 分組的注解,能夠同時(shí)應(yīng)用多個(gè)其他的緩存注解。 |
手動(dòng)使用EhCache
在實(shí)際開發(fā)過程中,存在不使用注解,需要自己添加緩存的情況。下面就以Ehcache為例,簡(jiǎn)單寫一下配置過程。
1. 添加依賴
引入springboot-cache和ehcache。需要注意,EhCache不需要配置version,SpringBoot的根pom已經(jīng)集成了。
<!-- 緩存 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- ehcache --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
2. 入口類配置
加入注解 @EnableCaching
@SpringBootApplication @EnableCaching public class DemoApplication { }
3. EhCache配置
在src\main\resources目錄下,添加ehcache.xml文件,內(nèi)容見文末。
4. application.application配置
# 配置ehcache緩存 spring.cache.type=ehcache # 指定ehcache配置文件路徑 spring.cache.ehcache.config=classpath:/ehcache.xml
5. 使用Cache
注入SpringBoot自動(dòng)配置的bean,org.springframework.cache.CacheManager。
一個(gè)簡(jiǎn)單的測(cè)試類:
package com.bbf.frame.test; import com.bbf.frame.Application; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import javax.annotation.Resource; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK) public class TestCache { @Resource private CacheManager cacheManager; @Test public void cacheTest() { // 顯示所有的Cache空間 System.out.println(StringUtils.join(cacheManager.getCacheNames(), ",")); Cache cache = cacheManager.getCache("userCache"); cache.put("key", "123"); System.out.println("緩存成功"); String res = cache.get("key", String.class); System.out.println(res); } }
附錄 EhCache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "http://ehcache.org/ehcache.xsd" updateCheck = "false"> <!-- 指定一個(gè)文件目錄,當(dāng)EHCache把數(shù)據(jù)寫到硬盤上時(shí),將把數(shù)據(jù)寫到這個(gè)文件目錄下 --> <diskStore path = "java.io.tmpdir"/> <!-- 默認(rèn)的管理策略 --> <defaultCache eternal = "false" maxElementsInMemory = "10000" overflowToDisk = "true" diskPersistent = "false" timeToIdleSeconds = "120" timeToLiveSeconds = "120" diskExpiryThreadIntervalSeconds = "120" memoryStoreEvictionPolicy = "LRU"/> <!-- 此緩存最多可以存活timeToLiveSeconds秒,如果期間超過timeToIdleSeconds秒未訪問,緩存失效 --> <cache name = "userCache" eternal = "false" maxElementsInMemory = "100" overflowToDisk = "false" diskPersistent = "false" timeToIdleSeconds = "120" timeToLiveSeconds = "180" memoryStoreEvictionPolicy = "LRU"/> <!-- maxElementsInMemory 內(nèi)存中最大緩存對(duì)象數(shù),看著自己的heap大小來搞 --> <!-- eternal:true表示對(duì)象永不過期,此時(shí)會(huì)忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認(rèn)為false --> <!-- maxElementsOnDisk:硬盤中最大緩存對(duì)象數(shù),若是0表示無窮大 --> <!-- overflowToDisk:true表示當(dāng)內(nèi)存緩存的對(duì)象數(shù)目達(dá)到了maxElementsInMemory界限后, 會(huì)把溢出的對(duì)象寫到硬盤緩存中。注意:如果緩存的對(duì)象要寫入到硬盤中的話,則該對(duì)象必須實(shí)現(xiàn)了Serializable接口才行。--> <!-- diskSpoolBufferSizeMB:磁盤緩存區(qū)大小,默認(rèn)為30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩存區(qū)。--> <!-- diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù) --> <!-- diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)為120秒 --> <!-- timeToIdleSeconds: 設(shè)定允許對(duì)象處于空閑狀態(tài)的最長(zhǎng)時(shí)間,以秒為單位。當(dāng)對(duì)象自從最近一次被訪問后, 如果處于空閑狀態(tài)的時(shí)間超過了timeToIdleSeconds屬性值,這個(gè)對(duì)象就會(huì)過期, EHCache將把它從緩存中清空。只有當(dāng)eternal屬性為false,該屬性才有效。如果該屬性值為0, 則表示對(duì)象可以無限期地處于空閑狀態(tài) --> <!-- timeToLiveSeconds:設(shè)定對(duì)象允許存在于緩存中的最長(zhǎng)時(shí)間,以秒為單位。當(dāng)對(duì)象自從被存放到緩存中后, 如果處于緩存中的時(shí)間超過了 timeToLiveSeconds屬性值,這個(gè)對(duì)象就會(huì)過期, EHCache將把它從緩存中清除。只有當(dāng)eternal屬性為false,該屬性才有效。如果該屬性值為0, 則表示對(duì)象可以無限期地存在于緩存中。timeToLiveSeconds必須大于timeToIdleSeconds屬性,才有意義 --> <!-- memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí), Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存??蛇x策略有:LRU(最近最少使用,默認(rèn)策略)、 FIFO(先進(jìn)先出)、LFU(最少訪問次數(shù))。--> </ehcache>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。