springboot 2.x配置redisTemplate及cacheManager
@Configuration @EnableCaching public class RedisConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); return om; } /** * Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer的区别 * https://blog.csdn.net/bai_bug/article/details/81222519 */ // @Bean // public GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer(ObjectMapper om) { // GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(om); // return serializer; // } @Bean public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(ObjectMapper om) { Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); jackson2JsonRedisSerializer.setObjectMapper(om); return jackson2JsonRedisSerializer; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer jackson2JsonRedisSerializer) { StringRedisTemplate redisTemplate = new StringRedisTemplate(redisConnectionFactory); RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer);//key序列化 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 redisTemplate.afterPropertiesSet(); return redisTemplate; } @Bean public KeyGenerator keyGenerator() { return (o, method, objects) -> { StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()); sb.append("." + method.getName() + "("); for (Object obj : objects) { sb.append(obj.toString()); } sb.append(")"); return sb.toString(); }; } /** * springboot2.x中,RedisCacheManager已经没有了单参数的构造方法 * 1.x中通过参数redisTemplate配置的方式不可行 */ @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, RedisSerializer jackson2JsonRedisSerializer) { RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)) // 设置缓存有效期一小时 .disableCachingNullValues() .computePrefixWith(cacheName -> "yourAppName".concat(":").concat(cacheName).concat(":")) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)); return RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(cacheConfiguration) .build(); } }
缓存注解的使用
@Cacheable
Spring 在执行 @Cacheable 标注的方法前先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,执行该方法并将方法返回值放进缓存。
参数: value缓存名、 key缓存键值、 condition满足缓存条件、unless否决缓存条件
@CachePut
和 @Cacheable 类似,但会把方法的返回值放入缓存中, 主要用于数据新增和修改方法
@CacheEvict
方法执行成功后会从缓存中移除相应数据。
参数: value缓存名、 key缓存键值、 condition满足缓存条件、 unless否决缓存条件、 allEntries是否移除所有数据(设置为true时会移除所有缓存)
cacheManager只针对注解缓存有效
只使用redisTemplate不需要配置