@Cacheable注解 给接口加Redis缓存 并配置过期时间
@GetMapping("/information") @Cacheable(cacheNames = "dfs_screen_information", key = "'lineId=' + #lineId + ',componentName=' + #componentName + ',dateIn=' + #dateIn") public ResponseData workOrderInformation(@RequestParam(value = "componentName", required = false) String componentName, @RequestParam(value = "date", required = false) String dateIn, @RequestParam(value = "lineId", required = false) Integer lineId) { if (isHistory(componentName, dateIn)) { return ResponseData.success(this.getHistoryData(componentName, dateIn)); } Date date = getDate(dateIn); return ResponseData.success(productionService.workOrderInformation(lineId, date)); }
cacheNames :缓存名称 全局唯一
key :不写默认使用方法名称,没有入参可以不写 ,有入参必写,否则会导致数据错误(key值变化时会更新缓存)
Redis配置类:
package com.yelink.dfs.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; import java.util.Objects; /** * redis配置类 * * @author shuang */ @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } /** * redis缓存管理器 */ @Bean public CacheManager screenCacheManager(RedisTemplate<String, Object> template) { return RedisCacheManager.RedisCacheManagerBuilder //Redis链接工厂 .fromConnectionFactory(Objects.requireNonNull(template.getConnectionFactory())) // 默认缓存 过期时间配置1h //.cacheDefaults(getCacheConfigurationWithTtl(60 * 60)) // 生产大屏缓存 过期时间 .withCacheConfiguration("dfs_screen_information", getCacheConfigurationWithTtl(5)) //配置同步修改或删除(事务感知) .transactionAware() .build(); } /** * 缓存配置 * * @param seconds 过期时间 s * @return */ private RedisCacheConfiguration getCacheConfigurationWithTtl(long seconds) { return RedisCacheConfiguration .defaultCacheConfig() // 不缓存null值 .disableCachingNullValues() // 缓存数据保存时间设置 .entryTtl(Duration.ofSeconds(seconds)); } }