一、介紹
- 環境:SpringBoot2.X + SpringCache + Redis
- Spring boot默認使用的是SimpleCacheConfiguration,使用ConcurrentMapCacheManager來實現緩存。
二、配置redis和cache
1. 引入redis依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2. 配置文件
spring:
redis:
host: 192.168.1.192
database: 1
port: 6379
password: 123456
timeout: 1s
jedis:
pool:
max-active: 20
max-idle: 20
min-idle: 10
max-wait: -1ms
cache:
redis:
use-key-prefix: true
key-prefix: dev
cache-null-values: false
time-to-live: 20s
3. 配置RedisCacheManager
- 解決redis保存數據亂碼的問題
- 解決從redis反序列化報錯的問題
- 增加失效時間
@Configuration @ConfigurationProperties(prefix = "spring.cache.redis") public class SpringCacheRedisConfig { private Duration timeToLive = Duration.ZERO; public void setTimeToLive(Duration timeToLive) { this.timeToLive = timeToLive; } @Bean public CacheManager cacheManager(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(timeToLive) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }
三、使用緩存
1. 開啟緩存
@EnableCaching
@SpringBootApplication
public class StatisticsApplication {
public static void main(String[] args) {
SpringApplication.run(StatisticsApplication.class, args);
}
}
2. 在方法上使用@Cacheable注解
@Cacheable(value = "userStatistics", key = "methodName") @Override public List<UserStatistics> getListByPage2(UserStatisticsReqVo userStatisticsReqVo) { Page<UserStatistics> userStatisticsPage = userStatisticsMapper.selectListByPage(userStatisticsReqVo); return userStatisticsPage.getResult(); }
四、測試

