一、JSR107緩存規範
-
CachingProvider 【緩存提供者】
定義了創建、配置、獲取、管理和控制多個CacheManager。一個應用可以在運行期訪問多個CachingProvider
-
CacheManager 【緩存管理】
定義了創建、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache存在於CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有
-
Cache 【緩存】
是一個類似Map的數據結構並臨時存儲以Key爲索引的值。一個Cache僅被一個CacheManager所擁有
-
Entry 【條目】
是一個存儲在Cache中的key-value對
-
Expiry 【到期】
每一個存儲在Cache中的條目有一個定義的有效期。一旦超過這個時間,條目爲過期的狀態。一旦過期,條目將不可訪問、更新和刪除。緩存有效期可以通過ExpiryPolicy設置
springboot 常用緩存註解
Cache | 緩存接口,定義緩存操作。實現有:RedisCache、EhCacheCache、ConcurrentMapCache等 |
---|---|
CacheManager | 緩存管理器,管理各種緩存(Cache)組件 |
@Cacheable | 主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存(添加緩存) |
@CacheEvict | 清空緩存 |
@CachePut | 保證方法被調用,又希望結果被緩存(修改緩存) |
@EnableCaching | 開啓基於註解的緩存 |
keyGenerator | 緩存數據時key生成策略 |
serialize | 緩存數據時value序列化策略 |
1.開啓緩存的註解,啓動類上 @EnableCaching
2.標註緩存註解
CacheManager管理多個cache組件的,對緩存的真正CRUD操作在Cache組件中,每一個緩存組件有自己唯一一個名字;
註解說明:
@Cacheable 將【方法】的運行結果進行緩存
註解屬性說明:
屬性 | 屬性值 | 備註 |
---|---|---|
value / cacheNames | 例:test | 指定緩存的名字 |
key | 例:#id | 緩存數據使用的key,默認是使用方法的參數值 編寫spel |
keyGenerator | 例: | 寫一個配置類加上註解 @Configuration 【key和keyGenerator 二選一】 |
cacheManage | 例: | 寫一個配置類加上註解 @Configuration 緩存管理器【指定當前緩存放在哪個管理器中】 |
condition | 例: #a0 > 1 | 符合指定條件的情況下才緩存 |
unless | 例: #p0 <= 1 | 當unless指定條件爲true,方法的返回值就不會緩存 |
sync | 例: false | 是否異步處理,默認爲false |
key的spel表達式部分語法:
/**
* key 的方法屬性: spel表達式:
* #root.methodName 獲取到被調用的【方法名字】
* #root.method.name 獲取到被調用的【方法名字】
* #root.target 當前被調用的【目標對象】
* #root.targetClass 當前被調用的【目標對象類】
* #root.args[0] 當前被調用的方法的【參數列表】
* #root.caches[0].name 當前方法被調用使用的緩存列表
* #iban、#a0、#p0 #參數名, #a0 或 #p0 ,0代表參數的索引
* #result 方法執行後的返回值
*/
keyGenerator自定義key的生成的配置:
/**
* 自定義生成 key 的生成規則
* Bean的默認名字爲 【方法名】
*/
@Bean(value = "myKeyGenerator")
public KeyGenerator myKeyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
// 自定義key的生成策略
return method.getName()+ Arrays.asList(params).toString();
}
};
}
cacheManage緩存管理器配
/**
* 【redis緩存管理與springboot註解整合】
* @Primary 表示這是默認的 緩存管理器
* Bean的名字默認爲 【方法名】
*/
@Primary
@Bean
public RedisCacheManager myRedisCacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer(Object.class);
//解決查詢緩存轉換異常的問題
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解決亂碼的問題)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMillis(-1))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.transactionAware()
.build();
return cacheManager;
}
@CachePut 修改數據的同時,也會修改緩存
屬性值同上
@CacheEvict 清空緩存
屬性 | 屬性值 | 備註 |
---|---|---|
allEntries | 例: false | 是否清空所有緩存 |
beforeInvocation | 例: false | 是否在方法執行之前清空緩存 |
@Caching 多條件複製緩存條件
@Caching(
cacheable = {
@Cacheable(cacheNames = "uav2",key = "#p0")
},
put = {
// cachePut 出現時,這個方法一定會執行
@CachePut(cacheNames = "uav2",key = "#result.id"),
@CachePut(cacheNames = "uav2",key = "#result.username")
}
)
@CacheConfig 用在類上面,指定當前類下面緩存的通用屬性
引入maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
部分配置application.yml
spring:
redis:
host: 47.101.50.211
database: 1
port: 6379
password: 123456
jedis:
pool:
# 連接池最大連接數,負值表示沒有限制
max-active: 100
# 連接池最大阻塞等待時間 -1 表示沒有限制
max-wait: -1ms
# 連接池中最大空閒連接
max-idle: 10
# 連接池中最小空閒連接
min-idle: 0
# 連接超時時間(毫秒)
timeout: 1000