SpringBoot與緩存
一、SR107
Java Caching定義了5個核心接口,分別是CachingProvider, CacheManager, Cache, Entry和Expiry。
- CachingProvider定義了創建、配置、獲取、管理和控制多個CacheManager。一個應用可以在運行期訪問多個CachingProvider。
- CacheManager定義了創建、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache存在於CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有。
- Cache是一個類似Map的數據結構並臨時存儲以Key為索引的值。一個Cache僅被一個CacheManager所擁有。
- Entry是一個存儲在Cache中的key-value對。
- Expiry每一個存儲在Cache中的條目有一個定義的有效期。一旦超過這個時間,條目為過期的狀態。一旦過期,條目將不可訪問、更新和刪除。緩存有效期可以通過ExpiryPolicy設置。
使用JSR107需要導入如下包
<dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> </dependency>
二、Spring緩存抽象
Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口來統一不同的緩存技術;並支持使用JCache(JSR-107)注解簡化我們開發;
- Cache接口為緩存的組件規范定義,包含緩存的各種操作集合;
- Cache接口下Spring提供了各種xxxCache的實現;如RedisCache,EhCacheCache , ConcurrentMapCache等;
- 每次調用需要緩存功能的方法時,Spring會檢查檢查指定參數的指定的目標方法是否已經被調用過;如果有就直接從緩存中獲取方法調用后的結果,如果沒有就調用方法並緩存結果后返回給用戶。下次調用直接從緩存中獲取。
- 使用Spring緩存抽象時我們需要關注以下兩點;
- 確定方法需要被緩存以及他們的緩存策略
- 從緩存中讀取之前緩存存儲的數據
三、 幾個重要概念和緩存注解
Cache | 緩存接口,定義緩存操作。實現有: RedisCache、 EhCacheCache、 ConcurrentMapCache等 |
CacheManager | 緩存管理器,管理各種緩存(Cache)組件 |
@Cacheable | 主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存 |
@CacheEvict | 清空緩存 |
@CachePut | 保證方法被調用,又希望結果被緩存。 |
@EnableCaching | 開啟基於注解的緩存 |
keyGenerator | 緩存數據時key生成策略 |
serialize | 緩存數據時value序列化策略 |
簡要說明:
- @Cacheable注解加載方法中,那么該方法第一次會查詢數據庫,然后就會吧數據放在緩存中,使用Cache 進行數據的讀取等操作。
- @CacheEvict刪除緩存,例如根據id刪除用戶,那么也要刪除緩存中的用戶信息
- @CachePut更新緩存,例如更新用戶信息后,同時也要更新緩存中的用戶信息
Cache SpEL available metadata
名字 | 位置 | 描述 | 示例 |
methodName | root object | 當前被調用的方法名 | #root.methodName |
method | root object | 當前被調用的方法 | #root.method.name |
target | root object | 當前被調用的目標對象 | #root.target |
targetClass | root object | 當前被調用的目標對象類 | #root.targetClass |
args | root object | 當前被調用的方法的參數列表 | #root.args[0] |
caches | root object | 當前方法調用使用的緩存列表(如@Cacheable(value={"cache1", "cache2"})), 則有兩個cache |
#root.caches[0].name |
argument name |
evaluation context | 方法參數的名字. 可以直接 #參數名 ,也可以使用 #p0或#a0 的 形式, 0代表參數的索引; |
#iban 、 #a0 、 #p0 |
result | evaluation context | 方法執行后的返回值(僅當方法執行之后的判斷有效,如 ‘unless’ , ’cache put’的表達式 ’cache evict’的表達式 beforeInvocation=false) |
#result |
四、緩存使用
• 1、引入spring-boot-starter-cache模塊
• 2、 @EnableCaching開啟緩存
• 3、使用緩存注解
• 4、切換為其他緩存
五、 整合redis實現緩存
1. 引入spring-boot-starter-data-redis
2. application.yml配置redis連接地址
3. 使用RestTemplate操作redis
1. redisTemplate.opsForValue();//操作字符串
2. redisTemplate.opsForHash();//操作hash
3. redisTemplate.opsForList();//操作list
4. redisTemplate.opsForSet();//操作set
5. redisTemplate.opsForZSet();//操作有序set
4. 配置緩存、 CacheManagerCustomizers
5. 測試使用緩存、 切換緩存、 CompositeCacheManager