1. 問題發現
在1.0版本中,我們配置redis的cacheManager是這種方式:
//緩存管理器
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//設置緩存過期時間
cacheManager.setDefaultExpiration(10000);
return cacheManager;
} //緩存管理器
然而在2.0版本中,這個代碼直接報錯,原因是RedisCacheManager取消了1.0版本中的public RedisCacheManager(RedisOperations redisOperations)
的這個構造方法,所以我們無法再用RedisTemplate
作爲參數來自定義CacheManager
。
下面看一看兩個版本的差別:
1.0 版本的CacheManager構造器
2.0 版本的CacheManager構造器
RedisCacheWriter
提供了對Redis的set、setnx、get等命令的訪問權限,可以由多個緩存實現共享,並負責寫/讀來自Redis的二進制數據。
RedisCacheConfiguration
根據名字都能想到它是提供redis的配置。
2. springboot2.0 中 CacheManager自定義配置
/**
* 緩存管理器
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//初始化一個RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//設置CacheManager的值序列化方式爲json序列化
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
.fromSerializer(jsonSerializer);
RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(pair);
//設置默認超過期時間是30秒
defaultCacheConfig.entryTtl(Duration.ofSeconds(30));
//初始化RedisCacheManager
return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}
上面的代碼中,還設置了CacheManager
的值序列化方式,所以有了這個配置,可以直接在註解的形式中實現json的redis存儲而不用再去多寫配置。