|
@@ -0,0 +1,166 @@
|
|
|
+package com.diagbot.config;
|
|
|
+
|
|
|
+import com.diagbot.util.BeanUtil;
|
|
|
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
|
|
+import com.fasterxml.jackson.annotation.PropertyAccessor;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.cache.CacheManager;
|
|
|
+import org.springframework.cache.annotation.CachingConfigurerSupport;
|
|
|
+import org.springframework.cache.annotation.EnableCaching;
|
|
|
+import org.springframework.cache.interceptor.KeyGenerator;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.data.redis.cache.RedisCacheManager;
|
|
|
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
|
|
|
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
|
|
|
+import org.springframework.data.redis.serializer.StringRedisSerializer;
|
|
|
+import redis.clients.jedis.JedisPoolConfig;
|
|
|
+
|
|
|
+@Configuration
|
|
|
+@EnableCaching
|
|
|
+@Slf4j
|
|
|
+public class RedisConfig extends CachingConfigurerSupport {
|
|
|
+
|
|
|
+ @Value("${spring.redis.database.cache}")
|
|
|
+ private String databaseCache;
|
|
|
+ @Value("${spring.redis.database.sms}")
|
|
|
+ private String databaseSms;
|
|
|
+ @Value("${spring.redis.host}")
|
|
|
+ private String host;
|
|
|
+ @Value("${spring.redis.password}")
|
|
|
+ private String password;
|
|
|
+ @Value("${spring.redis.port}")
|
|
|
+ private int port;
|
|
|
+ @Value("${spring.redis.timeout}")
|
|
|
+ private int timeout;
|
|
|
+ @Value("${spring.redis.jedis.pool.max-active}")
|
|
|
+ private int maxActive;
|
|
|
+ @Value("${spring.redis.jedis.pool.max-idle}")
|
|
|
+ private int maxIdle;
|
|
|
+ @Value("${spring.redis.jedis.pool.max-wait}")
|
|
|
+ private long maxWaitMillis;
|
|
|
+ @Value("${spring.redis.jedis.pool.min-idle}")
|
|
|
+ private int minIdle;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private JedisConnectionFactory jedisConnectionFactory;
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public JedisPoolConfig getRedisConfig(){
|
|
|
+ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
|
|
|
+ jedisPoolConfig.setMaxTotal(maxActive);
|
|
|
+ jedisPoolConfig.setMaxIdle(maxIdle);
|
|
|
+ jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
|
|
|
+ jedisPoolConfig.setMinIdle(minIdle);
|
|
|
+ return jedisPoolConfig;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean(destroyMethod = "destroy")
|
|
|
+ public JedisConnectionFactory redisConnectionFactory() {
|
|
|
+ log.info("Create JedisConnectionFactory successful");
|
|
|
+ JedisConnectionFactory factory = new JedisConnectionFactory();
|
|
|
+ factory.setHostName(host);
|
|
|
+ factory.setPort(port);
|
|
|
+ factory.setTimeout(timeout);
|
|
|
+ factory.setPassword(password);
|
|
|
+ factory.setDatabase(Integer.valueOf(databaseCache));
|
|
|
+ JedisPoolConfig poolConfig = getRedisConfig();
|
|
|
+ factory.setPoolConfig(poolConfig);
|
|
|
+ return factory;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ @Override
|
|
|
+ public CacheManager cacheManager() {
|
|
|
+ // 初始化缓存管理器,在这里我们可以缓存的整体过期时间什么的,我这里默认没有配置
|
|
|
+ RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
|
|
|
+ .RedisCacheManagerBuilder
|
|
|
+ .fromConnectionFactory(jedisConnectionFactory);
|
|
|
+ return builder.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean(name = "springSessionDefaultRedisSerializer")
|
|
|
+ public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
|
|
|
+ return new GenericJackson2JsonRedisSerializer();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
|
|
|
+ RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
|
|
|
+ redisTemplate.setConnectionFactory(jedisConnectionFactory);
|
|
|
+
|
|
|
+ // value值的序列化
|
|
|
+ redisTemplate.setValueSerializer(getSerializer());
|
|
|
+ redisTemplate.setHashValueSerializer(getSerializer());
|
|
|
+ // key的序列化采用StringRedisSerializer
|
|
|
+ redisTemplate.setKeySerializer(new StringRedisSerializer());
|
|
|
+ redisTemplate.setHashKeySerializer(new StringRedisSerializer());
|
|
|
+ redisTemplate.afterPropertiesSet();
|
|
|
+ return redisTemplate;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Jackson2JsonRedisSerializer getSerializer() {
|
|
|
+ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
|
|
|
+ ObjectMapper om = new ObjectMapper();
|
|
|
+ om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
|
|
+ om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
|
|
|
+ jackson2JsonRedisSerializer.setObjectMapper(om);
|
|
|
+ return jackson2JsonRedisSerializer;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ @Override
|
|
|
+ public KeyGenerator keyGenerator() {
|
|
|
+ // 设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存
|
|
|
+ // 使用:进行分割,可以很多显示出层级关系
|
|
|
+ // 这里其实就是new了一个KeyGenerator对象,只是这是lambda表达式的写法,我感觉很好用,大家感兴趣可以去了解下
|
|
|
+ return (target, method, params) -> {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ sb.append(target.getClass().getName());
|
|
|
+ sb.append(":");
|
|
|
+ sb.append(method.getName());
|
|
|
+ for (Object obj : params) {
|
|
|
+ sb.append(":" + String.valueOf(obj));
|
|
|
+ }
|
|
|
+ String rsToUse = String.valueOf(sb);
|
|
|
+ log.info("自动生成Redis Key -> [{}]", rsToUse);
|
|
|
+ return rsToUse;
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * sms验证使用的redis
|
|
|
+ *
|
|
|
+ * @param factory
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Bean(name = "redisTemplateForSms")
|
|
|
+ public RedisTemplate<String, Object> redisTemplateForSms(JedisConnectionFactory factory) {
|
|
|
+ return getRedisTemplate(factory, Integer.valueOf(databaseSms));
|
|
|
+ }
|
|
|
+
|
|
|
+ private RedisTemplate<String, Object> getRedisTemplate(JedisConnectionFactory factory, Integer database) {
|
|
|
+ JedisConnectionFactory factory2 = new JedisConnectionFactory();
|
|
|
+ BeanUtil.copyProperties(factory, factory2);
|
|
|
+ factory2.setDatabase(database);
|
|
|
+
|
|
|
+ RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
|
|
|
+ redisTemplate.setConnectionFactory(factory2);
|
|
|
+
|
|
|
+ // value值的序列化
|
|
|
+ redisTemplate.setValueSerializer(getSerializer());
|
|
|
+ redisTemplate.setHashValueSerializer(getSerializer());
|
|
|
+ // key的序列化采用StringRedisSerializer
|
|
|
+ redisTemplate.setKeySerializer(new StringRedisSerializer());
|
|
|
+ redisTemplate.setHashKeySerializer(new StringRedisSerializer());
|
|
|
+ redisTemplate.afterPropertiesSet();
|
|
|
+ return redisTemplate;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|