您好,登錄后才能下訂單哦!
這篇文章主要介紹了spring-boot整合ehcache如何實現緩存機制,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider。
ehcache提供了多種緩存策略,主要分為內存和磁盤兩級,所以無需擔心容量問題。
spring-boot是一個快速的集成框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。
由于spring-boot無需任何樣板化的配置文件,所以spring-boot集成一些其他框架時會有略微的不同。
1.spring-boot是一個通過maven管理的jar包的框架,集成ehcache需要的依賴如下
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.8.3</version> </dependency>
具體pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lclc.boot</groupId> <artifactId>boot-cache</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.1.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>17.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.8.3</version> </dependency> </dependencies> <dependencyManagement> <dependencies> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
2.使用ehcache,我們需要一個ehcache.xml來定義一些cache的屬性。
<?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"> <diskStore path="java.io.tmpdir/Tmp_EhCache" /> <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" /> <cache name="demo" eternal="false" maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU" /> </ehcache>
解釋下這個xml文件中的標簽。
(1).diskStore: 為緩存路徑,ehcache分為內存和磁盤兩級,此屬性定義磁盤的緩存位置。參數解釋如下:
user.home – 用戶主目錄
user.dir – 用戶當前工作目錄
java.io.tmpdir – 默認臨時文件路徑
(2).defaultCache:默認緩存策略,當ehcache找不到定義的緩存時,則使用這個緩存策略。只能定義一個。
(3).cache:自定緩存策略,為自定義的緩存策略。參數解釋如下:
cache元素的屬性:
name:緩存名稱
maxElementsInMemory:內存中最大緩存對象數
maxElementsOnDisk:硬盤中最大緩存對象數,若是0表示無窮大
eternal:true表示對象永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認為false
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(最少訪問次數)。
3.將ehcache的管理器暴露給spring的上下文容器,
@Configuration // 標注啟動了緩存 @EnableCaching public class CacheConfiguration { /* * ehcache 主要的管理器 */ @Bean(name = "appEhCacheCacheManager") public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){ return new EhCacheCacheManager (bean.getObject ()); } /* * 據shared與否的設置,Spring分別通過CacheManager.create()或new CacheManager()方式來創建一個ehcache基地. */ @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){ EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean (); cacheManagerFactoryBean.setConfigLocation (new ClassPathResource ("conf/ehcache-app.xml")); cacheManagerFactoryBean.setShared (true); return cacheManagerFactoryBean; } }
@Configuration:為spring-boot注解,主要標注此為配置類,優先掃描。
@Bean:向spring容器中加入bean。
至此所有的配置都做好了,通過spring-boot進行集成框架就是這么簡單。
4.使用ehcache
使用ehcache主要通過spring的緩存機制,上面我們將spring的緩存機制使用了ehcache進行實現,所以使用方面就完全使用spring緩存機制就行了。
具體牽扯到幾個注解:
@Cacheable:負責將方法的返回值加入到緩存中,參數3
@CacheEvict:負責清除緩存,參數4
參數解釋:
value:緩存位置名稱,不能為空,如果使用EHCache,就是ehcache.xml中聲明的cache的name
key:緩存的key,默認為空,既表示使用方法的參數類型及參數值作為key,支持SpEL
condition:觸發條件,只有滿足條件的情況才會加入緩存,默認為空,既表示全部都加入緩存,支持SpEL
allEntries:CacheEvict參數,true表示清除value中的全部緩存,默認為false
不多說,直接上代碼:
@Service public class CacheDemoServiceImpl implements CacheDemoService { /** * 緩存的key */ public static final String THING_ALL_KEY = "\"thing_all\""; /** * value屬性表示使用哪個緩存策略,緩存策略在ehcache.xml */ public static final String DEMO_CACHE_NAME = "demo"; @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY) @Override public void create(Thing thing){ Long id = getNextId (); thing.setId (id); data.put (id, thing); } @Cacheable(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'") @Override public Thing findById(Long id){ System.err.println ("沒有走緩存!" + id); return data.get (id); } @Cacheable(value = DEMO_CACHE_NAME,key = THING_ALL_KEY) @Override public List<Thing> findAll(){ return Lists.newArrayList (data.values ()); } @Override @CachePut(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'") @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY) public Thing update(Thing thing){ System.out.println (thing); data.put (thing.getId (), thing); return thing; } @CacheEvict(value = DEMO_CACHE_NAME) @Override public void delete(Long id){ data.remove (id); } }
5.只需要通過注解在service層方法上打注解便可以使用緩存,在find**上存入緩存,在delete**,update**上清除緩存。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“spring-boot整合ehcache如何實現緩存機制”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。