5bb371840f3f55ed37fca34b1e8282a84a50ba4f.svn-base 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package org.jeecg.common.modules.redis.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
  4. import com.fasterxml.jackson.annotation.PropertyAccessor;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.jeecg.common.constant.CacheConstant;
  9. import org.jeecg.common.constant.GlobalConstants;
  10. import org.jeecg.common.modules.redis.receiver.RedisReceiver;
  11. import org.jeecg.common.modules.redis.writer.JeecgRedisCacheWriter;
  12. import org.springframework.cache.CacheManager;
  13. import org.springframework.cache.annotation.CachingConfigurerSupport;
  14. import org.springframework.cache.annotation.EnableCaching;
  15. import org.springframework.context.annotation.Bean;
  16. import org.springframework.context.annotation.Configuration;
  17. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  18. import org.springframework.data.redis.cache.RedisCacheManager;
  19. import org.springframework.data.redis.cache.RedisCacheWriter;
  20. import org.springframework.data.redis.connection.RedisConnectionFactory;
  21. import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
  22. import org.springframework.data.redis.core.RedisTemplate;
  23. import org.springframework.data.redis.listener.ChannelTopic;
  24. import org.springframework.data.redis.listener.RedisMessageListenerContainer;
  25. import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
  26. import org.springframework.data.redis.serializer.*;
  27. import javax.annotation.Resource;
  28. import java.time.Duration;
  29. import static java.util.Collections.singletonMap;
  30. /**
  31. * 开启缓存支持
  32. * @author zyf
  33. * @Return:
  34. */
  35. @Slf4j
  36. @EnableCaching
  37. @Configuration
  38. public class RedisConfig extends CachingConfigurerSupport {
  39. @Resource
  40. private LettuceConnectionFactory lettuceConnectionFactory;
  41. // /**
  42. // * @description 自定义的缓存key的生成策略 若想使用这个key
  43. // * 只需要讲注解上keyGenerator的值设置为keyGenerator即可</br>
  44. // * @return 自定义策略生成的key
  45. // */
  46. // @Override
  47. // @Bean
  48. // public KeyGenerator keyGenerator() {
  49. // return new KeyGenerator() {
  50. // @Override
  51. // public Object generate(Object target, Method method, Object... params) {
  52. // StringBuilder sb = new StringBuilder();
  53. // sb.append(target.getClass().getName());
  54. // sb.append(method.getDeclaringClass().getName());
  55. // Arrays.stream(params).map(Object::toString).forEach(sb::append);
  56. // return sb.toString();
  57. // }
  58. // };
  59. // }
  60. /**
  61. * RedisTemplate配置
  62. * @param lettuceConnectionFactory
  63. * @return
  64. */
  65. @Bean
  66. public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
  67. log.info(" --- redis config init --- ");
  68. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = jacksonSerializer();
  69. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
  70. redisTemplate.setConnectionFactory(lettuceConnectionFactory);
  71. RedisSerializer<String> stringSerializer = new StringRedisSerializer();
  72. // key序列化
  73. redisTemplate.setKeySerializer(stringSerializer);
  74. // value序列化
  75. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  76. // Hash key序列化
  77. redisTemplate.setHashKeySerializer(stringSerializer);
  78. // Hash value序列化
  79. redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  80. redisTemplate.afterPropertiesSet();
  81. return redisTemplate;
  82. }
  83. /**
  84. * 缓存配置管理器
  85. *
  86. * @param factory
  87. * @return
  88. */
  89. @Bean
  90. public CacheManager cacheManager(LettuceConnectionFactory factory) {
  91. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = jacksonSerializer();
  92. // 配置序列化(解决乱码的问题),并且配置缓存默认有效期 6小时
  93. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(6));
  94. RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
  95. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
  96. //.disableCachingNullValues();
  97. // 以锁写入的方式创建RedisCacheWriter对象
  98. //update-begin-author:taoyan date:20210316 for:注解CacheEvict根据key删除redis支持通配符*
  99. RedisCacheWriter writer = new JeecgRedisCacheWriter(factory, Duration.ofMillis(50L));
  100. //RedisCacheWriter.lockingRedisCacheWriter(factory);
  101. // 创建默认缓存配置对象
  102. /* 默认配置,设置缓存有效期 1小时*/
  103. //RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1));
  104. /* 自定义配置test:demo 的超时时间为 5分钟*/
  105. RedisCacheManager cacheManager = RedisCacheManager.builder(writer).cacheDefaults(redisCacheConfiguration)
  106. .withInitialCacheConfigurations(singletonMap(CacheConstant.SYS_DICT_TABLE_CACHE,
  107. RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)).disableCachingNullValues()
  108. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))))
  109. .withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues()))
  110. .withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_RANKING, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues()))
  111. .withInitialCacheConfigurations(singletonMap(CacheConstant.PLUGIN_MALL_PAGE_LIST, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(24)).disableCachingNullValues()))
  112. .transactionAware().build();
  113. //update-end-author:taoyan date:20210316 for:注解CacheEvict根据key删除redis支持通配符*
  114. return cacheManager;
  115. }
  116. /**
  117. * redis 监听配置
  118. *
  119. * @param redisConnectionFactory redis 配置
  120. * @return
  121. */
  122. @Bean
  123. public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory, RedisReceiver redisReceiver, MessageListenerAdapter commonListenerAdapter) {
  124. RedisMessageListenerContainer container = new RedisMessageListenerContainer();
  125. container.setConnectionFactory(redisConnectionFactory);
  126. container.addMessageListener(commonListenerAdapter, new ChannelTopic(GlobalConstants.REDIS_TOPIC_NAME));
  127. return container;
  128. }
  129. @Bean
  130. MessageListenerAdapter commonListenerAdapter(RedisReceiver redisReceiver) {
  131. MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(redisReceiver, "onMessage");
  132. messageListenerAdapter.setSerializer(jacksonSerializer());
  133. return messageListenerAdapter;
  134. }
  135. private Jackson2JsonRedisSerializer jacksonSerializer() {
  136. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  137. ObjectMapper objectMapper = new ObjectMapper();
  138. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  139. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  140. jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
  141. return jackson2JsonRedisSerializer;
  142. }
  143. }