Browse Source

[chg]系统模块新增启动项初始化省市区树形结构列表存入redis缓存

别傲 5 years ago
parent
commit
d8cc0ef60b

+ 14 - 0
lift-common/src/main/java/cn.com.ty.lift.common/constants/RedisConstants.java

@@ -0,0 +1,14 @@
+package cn.com.ty.lift.common.constants;
+
+/**
+ * @author bieao
+ * @date 2019/12/3
+ * @description
+ */
+public class RedisConstants {
+    /**
+     * 省市区列表 key
+     */
+    public static final String RK_AREA_LIST = "system::area::list";
+
+}

+ 103 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/framework/conf/RedisConfig.java

@@ -0,0 +1,103 @@
+package cn.com.ty.lift.system.framework.conf;
+
+import java.lang.reflect.Method;
+import java.time.Duration;
+
+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.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Configuration
+@EnableCaching
+public class RedisConfig extends CachingConfigurerSupport {
+	
+    /**
+     * 设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存
+     */
+	@Bean
+    @Override
+    public KeyGenerator keyGenerator() {
+		return new KeyGenerator() {			
+			@Override
+			public Object generate(Object target, Method method, Object... params) {
+				StringBuilder sb = new StringBuilder();
+				sb.append(target.getClass().getName());
+	            sb.append(method.getName());
+	            for (Object param : params) {
+	                sb.append(param.toString());
+	            }
+	            return sb.toString();
+			}
+		};
+	}
+	
+	/**
+	 * 缓存管理
+	 */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+	@Bean
+    public CacheManager cacheManager(RedisConnectionFactory factory) {
+        // 初始化缓存管理器
+        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
+        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);
+
+        // 配置序列化(解决乱码的问题),过期时间30秒
+        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofSeconds(30))
+                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
+                .disableCachingNullValues();
+
+        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
+                .cacheDefaults(config)
+                .build();
+        return cacheManager;
+    }
+    
+	@Bean("redisTemplate")
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory jedisConnectionFactory) {
+		
+		Jackson2JsonRedisSerializer<Object> 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);
+        // 配置redisTemplate
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(jedisConnectionFactory);
+        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
+        // key序列化
+        redisTemplate.setKeySerializer(stringSerializer);
+        // value序列化
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+        // Hash key序列化
+        redisTemplate.setHashKeySerializer(stringSerializer);
+        // Hash value序列化
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+        
+    }
+	
+}

+ 24 - 3
lift-system-service/src/main/java/cn/com/ty/lift/system/framework/runner/SystemServiceRunner.java

@@ -1,12 +1,18 @@
 package cn.com.ty.lift.system.framework.runner;
 
+import cn.com.ty.lift.common.constants.RedisConstants;
+import cn.com.ty.lift.system.user.dao.entity.AreaCode;
+import cn.com.ty.lift.system.user.service.IAreaCodeService;
+import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * @author huangyuan
  * @date 2019-12-03
@@ -16,11 +22,26 @@ import org.springframework.stereotype.Component;
 @Slf4j
 public class SystemServiceRunner implements ApplicationRunner {
 
-    @Autowired
-    RedisTemplate redisTemplate;
+    @Resource
+    private RedisTemplate redisTemplate;
+
+    @Resource
+    private IAreaCodeService iAreaCodeService;
 
     @Override
     public void run(ApplicationArguments args) throws Exception {
+        //初始化省、市、区信息列表
+        initAreaList();
+    }
 
+    /**
+     * @description 初始化省、市、区信息列表
+     * @date 2019/12/3 6:31 PM
+     */
+    public void initAreaList() {
+        //组装省、市、区树形结构列表
+        List<AreaCode> areaCodeList = iAreaCodeService.areaTree();
+        redisTemplate.opsForValue().set(RedisConstants.RK_AREA_LIST, areaCodeList);
+        log.info("初始化区域信息列表", JSONUtil.parse(areaCodeList));
     }
 }