CacheConfig.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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.databind.module.SimpleModule;
  9. import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  10. import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
  11. import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  12. import com.izouma.nineth.domain.User;
  13. import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  14. import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
  15. import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  18. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  19. import org.springframework.data.redis.cache.RedisCacheManager;
  20. import org.springframework.data.redis.cache.RedisCacheWriter;
  21. import org.springframework.data.redis.connection.RedisConnectionFactory;
  22. import org.springframework.data.redis.core.RedisTemplate;
  23. import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
  24. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  25. import org.springframework.data.redis.serializer.RedisSerializationContext;
  26. import org.springframework.data.redis.serializer.StringRedisSerializer;
  27. import java.time.Duration;
  28. import java.util.HashMap;
  29. import java.util.Map;
  30. @Configuration
  31. @AutoConfigureAfter({RedisAutoConfiguration.class, CacheAutoConfiguration.class})
  32. @EnableRedisRepositories(basePackages = "com.izouma.nineth.repo.redis")
  33. public class CacheConfig {
  34. @Bean
  35. RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  36. RedisTemplate<String, Object> template = new RedisTemplate<>();
  37. template.setConnectionFactory(redisConnectionFactory);
  38. //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
  39. Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
  40. ObjectMapper mapper = new ObjectMapper();
  41. mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  42. mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
  43. ObjectMapper.DefaultTyping.NON_FINAL,
  44. JsonTypeInfo.As.WRAPPER_ARRAY);
  45. mapper.registerModule(new Hibernate5Module()
  46. .enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING));
  47. mapper.registerModule(new JavaTimeModule());
  48. mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  49. mapper.setConfig(mapper.getSerializationConfig().withView(User.View.Detail.class));
  50. SimpleModule simpleModule = new SimpleModule();
  51. simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
  52. simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
  53. mapper.registerModule(simpleModule);
  54. serializer.setObjectMapper(mapper);
  55. template.setValueSerializer(serializer);
  56. //使用StringRedisSerializer来序列化和反序列化redis的key值
  57. template.setKeySerializer(new StringRedisSerializer());
  58. template.setHashKeySerializer(new StringRedisSerializer());
  59. template.setHashValueSerializer(serializer);
  60. template.afterPropertiesSet();
  61. return template;
  62. }
  63. // @Bean
  64. // public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
  65. // RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
  66. // RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
  67. // .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
  68. // return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
  69. // }
  70. @Bean
  71. public RedisCacheManager userRedisCacheManager(RedisTemplate redisTemplate) {
  72. Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
  73. ObjectMapper mapper = new ObjectMapper();
  74. mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  75. mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
  76. ObjectMapper.DefaultTyping.NON_FINAL,
  77. JsonTypeInfo.As.WRAPPER_ARRAY);
  78. mapper.registerModule(new Hibernate5Module()
  79. .enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING));
  80. mapper.registerModule(new JavaTimeModule());
  81. mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  82. mapper.setConfig(mapper.getSerializationConfig().withView(User.View.Detail.class));
  83. SimpleModule simpleModule = new SimpleModule();
  84. simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
  85. simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
  86. mapper.registerModule(simpleModule);
  87. serializer.setObjectMapper(mapper);
  88. Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
  89. cacheNamesConfigurationMap.put("collectionList", RedisCacheConfiguration.defaultCacheConfig()
  90. .entryTtl(Duration.ofSeconds(10))
  91. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  92. cacheNamesConfigurationMap.put("myUserInfo", RedisCacheConfiguration.defaultCacheConfig()
  93. .entryTtl(Duration.ofHours(1))
  94. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  95. cacheNamesConfigurationMap.put("userStat", RedisCacheConfiguration.defaultCacheConfig()
  96. .entryTtl(Duration.ofHours(1))
  97. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  98. cacheNamesConfigurationMap.put("userList", RedisCacheConfiguration.defaultCacheConfig()
  99. .entryTtl(Duration.ofMinutes(1))
  100. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  101. cacheNamesConfigurationMap.put("sandPay", RedisCacheConfiguration.defaultCacheConfig()
  102. .entryTtl(Duration.ofHours(1))
  103. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  104. cacheNamesConfigurationMap.put("sandPayGift", RedisCacheConfiguration.defaultCacheConfig()
  105. .entryTtl(Duration.ofHours(1))
  106. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  107. RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
  108. .entryTtl(Duration.ofDays(7))
  109. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
  110. cacheNamesConfigurationMap.put("payOrder", RedisCacheConfiguration.defaultCacheConfig()
  111. .entryTtl(Duration.ofHours(1))
  112. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
  113. RedisCacheManager redisCacheManager = RedisCacheManager.builder()
  114. .cacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory()))
  115. .withInitialCacheConfigurations(cacheNamesConfigurationMap)
  116. .cacheDefaults(cacheConfiguration)
  117. .build();
  118. return redisCacheManager;
  119. }
  120. }