CacheConfig.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.izouma.nineth.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.JsonTypeInfo;
  4. import com.fasterxml.jackson.annotation.PropertyAccessor;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import com.fasterxml.jackson.databind.SerializationFeature;
  7. import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
  8. import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
  9. import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  10. import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  11. import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
  12. import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  13. import org.springframework.context.annotation.Bean;
  14. import org.springframework.context.annotation.Configuration;
  15. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  16. import org.springframework.data.redis.cache.RedisCacheManager;
  17. import org.springframework.data.redis.cache.RedisCacheWriter;
  18. import org.springframework.data.redis.connection.RedisConnectionFactory;
  19. import org.springframework.data.redis.core.RedisTemplate;
  20. import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
  21. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  22. import org.springframework.data.redis.serializer.RedisSerializationContext;
  23. import org.springframework.data.redis.serializer.StringRedisSerializer;
  24. import java.time.Duration;
  25. @Configuration
  26. @AutoConfigureAfter({RedisAutoConfiguration.class, CacheAutoConfiguration.class})
  27. @EnableRedisRepositories
  28. public class CacheConfig {
  29. @Bean
  30. RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  31. RedisTemplate<String, Object> template = new RedisTemplate<>();
  32. template.setConnectionFactory(redisConnectionFactory);
  33. //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
  34. Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
  35. ObjectMapper mapper = new ObjectMapper();
  36. mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  37. mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
  38. ObjectMapper.DefaultTyping.NON_FINAL,
  39. JsonTypeInfo.As.WRAPPER_ARRAY);
  40. mapper.registerModule(new Hibernate5Module()
  41. .enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING));
  42. mapper.registerModule(new JavaTimeModule());
  43. mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  44. mapper.setConfig(mapper.getSerializationConfig().withView(RedisView.class));
  45. serializer.setObjectMapper(mapper);
  46. template.setValueSerializer(serializer);
  47. //使用StringRedisSerializer来序列化和反序列化redis的key值
  48. template.setKeySerializer(new StringRedisSerializer());
  49. template.setHashKeySerializer(new StringRedisSerializer());
  50. template.setHashValueSerializer(serializer);
  51. template.afterPropertiesSet();
  52. return template;
  53. }
  54. @Bean
  55. public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
  56. RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
  57. RedisSerializationContext.SerializationPair serializationPair = RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer());
  58. RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
  59. //一般缓存,需要控制时长,防止一直缓存
  60. redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofDays(1));
  61. redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(serializationPair);
  62. //自定义缓存定义方式,可控制失效时长
  63. return new CustomRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
  64. }
  65. }