當屢次查詢數據庫影響到系統性能的時候,能夠考慮使用緩存,來解決數據訪問新能的問題。
SpringBoot 已經爲咱們提供了自動配置多個 CacheManager 的實現,只要去實現使用它就能夠了。css
通常的系統都是優先使用 EhCache,它工做在 JAVA 進程中,在傳統的應用沒有太大要求的時候,使用它比較方便,分佈式系統中去使用 Shiro 集中管理緩存。html
在 pom.xml 中加入依賴java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
新建 ehcache.xml
,加入緩存相關參數, 我新添加一個 name 爲 users 的緩存設置:spring
<?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 maxElementsInMemory="1000" maxEntriesLocalHeap="400" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/>
<cache name="users" maxEntriesLocalHeap="200" timeToLiveSeconds="600" />
</ehcache>
參數詳解:數據庫
ehcache.xml
做爲 EhCache 的配置文件:spring:
cache:
ehcache:
config: config/ehcache.xml # 指定 ehcache.xml 建立EhCache的緩存管理器
type: ehcache # 指定緩存管理器
@EnableCaching
,開啓緩存。使用的時候須要注意,咱們以前在 shiro 緩存中 配置了相關的緩存的配置,如今須要把 shiro 相關的緩存的內容所有都要刪除掉,否則二者的緩存會存在衝突。
仍是以 shiro 的獲取權限列表的服務爲例,不用 shiro-cache 後,直接在查詢的這裏本身添加上緩存就能夠了。數組
@CacheConfig(cacheNames = "users")
public interface ShiroService {
/** * 獲取用戶權限 * * @param userId 用戶ID * @return 權限 */
@Cacheable
Set<String> getUserPermissions(long userId);
debug 調試,緩存
@Autowired
private CacheManager cacheManager;
發現 key 爲 users
中存儲了相關內容。springboot
@CacheConfig
:主要用於配置該類中會用到的一些共用的緩存配置。在這裏@CacheConfig(cacheNames = "users")
:配置了該數據訪問對象中返回的內容將存儲於名爲users的緩存對象中,咱們也能夠不使用該註解,直接經過@Cacheable本身配置緩存集的名字來定義。getUserPermissions(long userId)
函數的返回值將被加入緩存。同時在查詢時,會先從緩存中獲取,若不存在纔再發起對數據庫的訪問。該註解主要有下面幾個參數: value
、cacheNames
:兩個等同的參數(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的時候纔會被緩存,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
同樣的參數以外,它還有下面兩個參數:
1. allEntries
:非必需,默認爲false
。當爲true
時,會移除全部數據
2. beforeInvocation
:非必需,默認爲false
,會在調用方法以後移除數據。當爲true
時,會在調用方法以前移除數據。markdown
在Spring Boot中經過@EnableCaching註解自動化配置合適的緩存管理器(CacheManager),Spring Boot根據下面的順序去偵測緩存提供者:
1. Generic
2. JCache (JSR-107)
3. EhCache 2.x
4. Hazelcast
5. Infinispan
6. Redis
7. Guava
8. Simpleless
一般仍是推薦去指定一個 緩存類型比較好,在系統配置文件配置:
spring:
cache:
type: ehcache