RedisConfig.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package org.jeecg.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
  6. import org.springframework.cache.CacheManager;
  7. import org.springframework.cache.annotation.CachingConfigurerSupport;
  8. import org.springframework.cache.annotation.EnableCaching;
  9. import org.springframework.cache.interceptor.KeyGenerator;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  13. import org.springframework.data.redis.cache.RedisCacheManager;
  14. import org.springframework.data.redis.cache.RedisCacheWriter;
  15. import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
  16. import org.springframework.data.redis.core.RedisTemplate;
  17. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  18. import org.springframework.data.redis.serializer.RedisSerializer;
  19. import org.springframework.data.redis.serializer.StringRedisSerializer;
  20. import javax.annotation.Resource;
  21. import java.lang.reflect.Method;
  22. import java.time.Duration;
  23. import java.util.Arrays;
  24. @Configuration
  25. @EnableCaching
  26. public class RedisConfig extends CachingConfigurerSupport {
  27. @Resource
  28. private LettuceConnectionFactory lettuceConnectionFactory;
  29. /**
  30. * @description 自定义的缓存key的生成策略 若想使用这个key
  31. * 只需要讲注解上keyGenerator的值设置为keyGenerator即可</br>
  32. * @return 自定义策略生成的key
  33. */
  34. @Override
  35. @Bean
  36. public KeyGenerator keyGenerator() {
  37. return new KeyGenerator() {
  38. @Override
  39. public Object generate(Object target, Method method, Object... params) {
  40. StringBuilder sb = new StringBuilder();
  41. sb.append(target.getClass().getName());
  42. sb.append(method.getDeclaringClass().getName());
  43. Arrays.stream(params).map(Object::toString).forEach(sb::append);
  44. return sb.toString();
  45. }
  46. };
  47. }
  48. /**
  49. * RedisTemplate配置
  50. */
  51. @Bean
  52. public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
  53. // 设置序列化
  54. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
  55. ObjectMapper om = new ObjectMapper();
  56. om.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
  57. om.enableDefaultTyping(DefaultTyping.NON_FINAL);
  58. jackson2JsonRedisSerializer.setObjectMapper(om);
  59. // 配置redisTemplate
  60. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
  61. redisTemplate.setConnectionFactory(lettuceConnectionFactory);
  62. RedisSerializer<?> stringSerializer = new StringRedisSerializer();
  63. // key序列化
  64. redisTemplate.setKeySerializer(stringSerializer);
  65. // value序列化
  66. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  67. // Hash key序列化
  68. redisTemplate.setHashKeySerializer(stringSerializer);
  69. // Hash value序列化
  70. redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  71. redisTemplate.afterPropertiesSet();
  72. return redisTemplate;
  73. }
  74. /**
  75. * 缓存配置管理器
  76. */
  77. @Bean
  78. public CacheManager cacheManager(LettuceConnectionFactory factory) {
  79. // 以锁写入的方式创建RedisCacheWriter对象
  80. RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory);
  81. /**
  82. * 设置CacheManager的Value序列化方式为JdkSerializationRedisSerializer,
  83. * 但其实RedisCacheConfiguration默认就是使用 StringRedisSerializer序列化key,
  84. * JdkSerializationRedisSerializer序列化value, 所以以下注释代码就是默认实现,没必要写,直接注释掉
  85. */
  86. // RedisSerializationContext.SerializationPair pair =
  87. // RedisSerializationContext.SerializationPair.fromSerializer(new
  88. // JdkSerializationRedisSerializer(this.getClass().getClassLoader()));
  89. // RedisCacheConfiguration config =
  90. // RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
  91. // 创建默认缓存配置对象
  92. // 创建默认缓存配置对象
  93. //设置缓存默认有效期3小时;
  94. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(3));
  95. RedisCacheManager cacheManager = new RedisCacheManager(writer, config);
  96. return cacheManager;
  97. }
  98. }