|
@@ -0,0 +1,143 @@
|
|
|
+package com.gis.common.config;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
|
|
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
|
|
+import com.fasterxml.jackson.annotation.PropertyAccessor;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
|
|
|
+import org.springframework.cache.CacheManager;
|
|
|
+import org.springframework.cache.annotation.CachingConfigurerSupport;
|
|
|
+import org.springframework.cache.annotation.EnableCaching;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
|
|
|
+import org.springframework.data.redis.cache.RedisCacheManager;
|
|
|
+import org.springframework.data.redis.connection.RedisConnectionFactory;
|
|
|
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.data.redis.core.script.DefaultRedisScript;
|
|
|
+import org.springframework.data.redis.serializer.RedisSerializationContext;
|
|
|
+import org.springframework.data.redis.serializer.RedisSerializer;
|
|
|
+import org.springframework.data.redis.serializer.StringRedisSerializer;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.time.Duration;
|
|
|
+
|
|
|
+/**
|
|
|
+ * redis配置
|
|
|
+ *
|
|
|
+ * @author fdkk
|
|
|
+ */
|
|
|
+@Configuration
|
|
|
+@EnableCaching
|
|
|
+public class RedisConfig extends CachingConfigurerSupport
|
|
|
+{
|
|
|
+
|
|
|
+ /**
|
|
|
+ * by owen 2022-5-5
|
|
|
+ * 缓存对象序列化
|
|
|
+ * @param connectionFactory
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Bean
|
|
|
+ @SuppressWarnings(value = { "unchecked", "rawtypes" })
|
|
|
+ public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
|
|
|
+ {
|
|
|
+ RedisTemplate<Object, Object> template = new RedisTemplate<>();
|
|
|
+ template.setConnectionFactory(connectionFactory);
|
|
|
+
|
|
|
+ FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
|
|
|
+
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
|
|
+ mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
|
|
|
+ serializer.setObjectMapper(mapper);
|
|
|
+
|
|
|
+ // 使用StringRedisSerializer来序列化和反序列化redis的key值
|
|
|
+ template.setKeySerializer(new StringRedisSerializer());
|
|
|
+ template.setValueSerializer(serializer);
|
|
|
+
|
|
|
+ // Hash的key也采用StringRedisSerializer的序列化方式
|
|
|
+ template.setHashKeySerializer(new StringRedisSerializer());
|
|
|
+ template.setHashValueSerializer(serializer);
|
|
|
+
|
|
|
+ template.afterPropertiesSet();
|
|
|
+ return template;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public DefaultRedisScript<Long> limitScript()
|
|
|
+ {
|
|
|
+ DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
|
|
|
+ redisScript.setScriptText(limitScriptText());
|
|
|
+ redisScript.setResultType(Long.class);
|
|
|
+ return redisScript;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 限流脚本
|
|
|
+ */
|
|
|
+ private String limitScriptText()
|
|
|
+ {
|
|
|
+ return "local key = KEYS[1]\n" +
|
|
|
+ "local count = tonumber(ARGV[1])\n" +
|
|
|
+ "local time = tonumber(ARGV[2])\n" +
|
|
|
+ "local current = redis.call('get', key);\n" +
|
|
|
+ "if current and tonumber(current) > count then\n" +
|
|
|
+ " return tonumber(current);\n" +
|
|
|
+ "end\n" +
|
|
|
+ "current = redis.call('incr', key)\n" +
|
|
|
+ "if tonumber(current) == 1 then\n" +
|
|
|
+ " redis.call('expire', key, time)\n" +
|
|
|
+ "end\n" +
|
|
|
+ "return tonumber(current);";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private LettuceConnectionFactory lettuceConnectionFactory;
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * by owen 2022-5-5
|
|
|
+ * 配置CacheManager
|
|
|
+ * 配置key 过期时间
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Bean
|
|
|
+ public CacheManager cacheManager() {
|
|
|
+ RedisSerializer<String> redisSerializer = new StringRedisSerializer();
|
|
|
+// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
|
|
|
+ FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
|
|
|
+
|
|
|
+ //解决查询缓存转换异常的问题
|
|
|
+ ObjectMapper om = new ObjectMapper();
|
|
|
+ om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
|
|
+ om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
|
|
|
+ serializer.setObjectMapper(om);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 配置序列化(解决乱码的问题)
|
|
|
+ RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
|
|
|
+// .entryTtl(Duration.ZERO)
|
|
|
+ .entryTtl(Duration.ofSeconds(20)) //设置缓存失效时间
|
|
|
+ .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
|
|
|
+ .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))
|
|
|
+ .disableCachingNullValues();
|
|
|
+
|
|
|
+ RedisCacheManager cacheManager = RedisCacheManager.builder(lettuceConnectionFactory)
|
|
|
+ .cacheDefaults(config)
|
|
|
+ .withCacheConfiguration("module", config.entryTtl(Duration.ofMinutes(5))) // module类型过期时间5分钟
|
|
|
+ .build();
|
|
|
+ return cacheManager;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|