ソースを参照

1.dao-redis修改 可支持di点的读取
2.redis2taos修改 TsPointService 获取测点缓存
3.redis2toas修改 解决因点过多导致写入taos sql过长问题

wanghs 2 年 前
コミット
e1f896220a

+ 16 - 14
dao/dao-redis/src/main/java/com/gyee/wisdom/dao/redis/RedisLatestDao.java

@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -26,27 +27,29 @@ public class RedisLatestDao implements ILatestDao {
 
     public Map<String, TsData> getTsDataLatest(List<TsPoint> tsPoints) throws Exception {
 
-        Map<String,TsData> resultTest=new HashMap<>();
+        Map<String, TsData> resultTest = new HashMap<>();
         try {
-           List<String> collect = tsPoints.stream().map(s -> s.getId()).collect(Collectors.toList());
-            for (int i = 1;i<=20000;i++){
-                collect.add("test_"+i);
-            }
+            List<String> collect = tsPoints.stream().map(s -> s.getId()).collect(Collectors.toList());
             List<byte[]> bytesList = redisValUtil.getBytesList(Integer.parseInt(tsPoints.get(0).getTag()), collect);
             for (int i = 0; i < bytesList.size(); i++) {
-                double val = ByteUtil.getDouble(bytesList.get(i),0);
-                long ts = ByteUtil.getLong2(bytesList.get(i),8);
-                DoubleTsData doubleTsData = new DoubleTsData(ts, (short) 0, val);
-                //resultTest.put(tsPoints.get(i).getId(), doubleTsData);
-                resultTest.put(collect.get(i),doubleTsData);
+                double val = ByteUtil.getDouble(bytesList.get(i), 0);
+                long ts = ByteUtil.getLong2(bytesList.get(i), 8);
+                if (collect.get(i).contains("DI")) {
+                    Boolean bl = false;
+                    if (val != 0)
+                        bl = true;
+                    BooleanTsData booleanTsData = new BooleanTsData(ts, (short) 0, bl);
+                    resultTest.put(collect.get(i), booleanTsData);
+                } else {
+                    DoubleTsData doubleTsData = new DoubleTsData(ts, (short) 0, val);
+                    resultTest.put(collect.get(i), doubleTsData);
+                }
             }
-        }catch (Exception ex){
+        } catch (Exception ex) {
 
         }
 
 
-
-
 //        Map<String, TsData> result = new HashMap<>();
 //        for (TsPoint tsPoint:tsPoints){
 //            try {
@@ -116,5 +119,4 @@ public class RedisLatestDao implements ILatestDao {
     }
 
 
-
 }

+ 1 - 1
dao/dao-redis/src/main/java/com/gyee/wisdom/it235/util/RedisValUtil.java

@@ -73,7 +73,7 @@ public class RedisValUtil extends RedisBaseUtil {
                 rawKeys[i]=keyList.get(i).getBytes("ascii");
             }
 
-            resultList = knife4jRedisManager.redisTemplate(2).getConnectionFactory().getConnection().mGet(rawKeys);
+            resultList = knife4jRedisManager.redisTemplate(dbIndex).getConnectionFactory().getConnection().mGet(rawKeys);
         }catch (Exception ex){
 
         }finally {

+ 2 - 6
transport/redis2taos/src/main/java/com/gyee/wisdom/backwork/ReadAndWrite.java

@@ -55,29 +55,25 @@ public class ReadAndWrite extends Thread {
                 Thread.sleep(1000);
                 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                 String date = df.format(new Date());
-                System.out.println(date);
                 //获取所有测点
                 lst = tsPointService.getAllTsPointToCache();
-                log.info("测点加载完成,测点数量:" + lst.size());
                 //读取redis
                 Date readRedisST=new Date();
                 Map<String, TsData> tsDataMap = latestDao.getTsDataLatest(lst);
                 Date readRedisET=new Date();
-                log.info("读取redis成功!!!"+(readRedisET.getTime()-readRedisST.getTime()));
+              //  log.error("读取redis成功!!!时间为:"+(readRedisET.getTime()-readRedisST.getTime()));
                 //获取差集
                 tsDataMap.entrySet().removeAll(map.keySet());
                 //写入taos
                 Date writeTaosST=new Date();
                 int b = writeHistoryValue.writeValue(tsDataMap);
                 Date writeTaosET=new Date();
-                log.error("写入taos时间"+(writeTaosET.getTime()-writeTaosST.getTime()));
+               // log.error("写入taos时间"+(writeTaosET.getTime()-writeTaosST.getTime()));
                 if(b>0) {
                     for (String key : result.keySet()) {
                         map.put(key, result.get(key));
                     }
                 }
-                String date2 = df.format(new Date());
-                System.out.println(date2);
             }
         } catch (InterruptedException e) {
             e.printStackTrace();

+ 20 - 15
transport/redis2taos/src/main/java/com/gyee/wisdom/domain/timeseries/TsPointService.java

@@ -24,31 +24,36 @@ public class TsPointService {
     //key1 风机编号,key2:风机统一编码
     private Map<String, Map<String, TsPoint>> windturbineTagMap = new HashMap<>();
 
+    private List<TsPoint> tsPointList = new ArrayList<>();
+
     @Autowired
     private IThingsPointDao thingsPointDao;
 
 
     public List<TsPoint> getAllTsPointToCache() {
         try {
-            List<TsPoint> lst = thingsPointDao.getAllTsPoint();
-            for (TsPoint point : lst) {
-                if (!tagMap.containsKey(point.getId())) {
-                    tagMap.put(point.getId(), point);
-                }
-                if (!windturbineTagMap.containsKey(point.getThingId())) {
-                    Map<String, TsPoint> uniformCodeMap = new HashMap<>();
-                    uniformCodeMap.put(point.getUniformCode(), point);
-                    windturbineTagMap.put(point.getThingId(), uniformCodeMap);
-                } else {
-                    Map<String, TsPoint> uniformCodeMap = windturbineTagMap.get(point.getThingId());
-
-                    if (!uniformCodeMap.containsKey(point.getUniformCode())) {
+            if (tsPointList.size() <= 0) {
+                List<TsPoint> lst = thingsPointDao.getAllTsPoint();
+                for (TsPoint point : lst) {
+                    if (!tagMap.containsKey(point.getId())) {
+                        tagMap.put(point.getId(), point);
+                    }
+                    if (!windturbineTagMap.containsKey(point.getThingId())) {
+                        Map<String, TsPoint> uniformCodeMap = new HashMap<>();
                         uniformCodeMap.put(point.getUniformCode(), point);
+                        windturbineTagMap.put(point.getThingId(), uniformCodeMap);
+                    } else {
+                        Map<String, TsPoint> uniformCodeMap = windturbineTagMap.get(point.getThingId());
+
+                        if (!uniformCodeMap.containsKey(point.getUniformCode())) {
+                            uniformCodeMap.put(point.getUniformCode(), point);
+                        }
                     }
                 }
+                tsPointList = lst;
             }
-            return lst;
-        }catch (Exception ex) {
+            return tsPointList;
+        } catch (Exception ex) {
             System.out.println("缓存所有测点发生异常");
         }
         System.out.println("测点缓存完毕");

+ 37 - 11
transport/redis2taos/src/main/java/com/gyee/wisdom/taos/WriteRealValue.java

@@ -1,5 +1,6 @@
 package com.gyee.wisdom.taos;
 
+import com.gyee.wisdom.common.data.timeseries.BooleanTsData;
 import com.gyee.wisdom.common.data.timeseries.DoubleTsData;
 import com.gyee.wisdom.common.data.timeseries.TsData;
 import lombok.extern.slf4j.Slf4j;
@@ -8,9 +9,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.sql.Statement;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
+
 @Slf4j
 @Component
 public class WriteRealValue {
@@ -22,18 +23,43 @@ public class WriteRealValue {
 
     public int writeValue(Map<String, TsData> tsDataMap) throws Exception {
         Statement st = taosConfig.getInstance().createStatement();
+
+        List<StringBuilder> sbList = new ArrayList<>();
+        int mark = 0;
         StringBuilder sb = new StringBuilder();
+        sbList.add(sb);
         sb.append("insert into ");
         for (String key : tsDataMap.keySet()) {
+            if (mark > 0 && mark % 2999 == 0) {
+                sb = new StringBuilder();
+                sbList.add(sb);
+                sb.append("insert into ");
+            }
             long time = tsDataMap.get(key).getTs();
             String point = key;
-            DoubleTsData doubleTsData = (DoubleTsData)tsDataMap.get(key);
-            double value = doubleTsData.getDoubleValue();
-            sb.append(point).append(" values (");
-            sb.append(time).append(",").append(value).append(")");
+            if (point.contains("DI")) {
+                BooleanTsData booleanTsData = (BooleanTsData) tsDataMap.get(key);
+                boolean value = booleanTsData.getBooleanValue();
+                sb.append(point).append(" values (");
+                sb.append(time).append(",").append(String.valueOf(value)).append(")");
+            } else {
+                DoubleTsData doubleTsData = (DoubleTsData) tsDataMap.get(key);
+                double value = doubleTsData.getDoubleValue();
+                sb.append(point).append(" values (");
+                sb.append(time).append(",").append(value).append(")");
+            }
+            mark += 1;
+
         }
-        val i = st.executeUpdate(sb.toString());
-        return i==tsDataMap.size()? tsDataMap.size() : 0;
+
+        int updateCount = 0;
+        for (StringBuilder s :
+                sbList) {
+            val i = st.executeUpdate(s.toString());
+            updateCount = updateCount + i;
+        }
+        log.info("taos-write" + updateCount );
+        return updateCount;
     }
 
     //测试新建20000个点表
@@ -41,7 +67,7 @@ public class WriteRealValue {
         Statement st = taosConfig.getInstance().createStatement();
         StringBuilder sb = new StringBuilder();
         sb.append("create table ");
-        for (int i = 1 ;i <= 20000; i++) {
+        for (int i = 1; i <= 20000; i++) {
             sb.append("'test_").append(i).append("'").append(" ").append("using").append(" ");
             sb.append("'windturbine'").append(" ").append("tags").append("('").append("test_").append(i).append("')");
         }
@@ -53,7 +79,7 @@ public class WriteRealValue {
     public void removeTable() throws Exception {
         Statement st = taosConfig.getInstance().createStatement();
         StringBuilder sb = new StringBuilder();
-        for (int i = 2450 ;i <= 20000; i++) {
+        for (int i = 2450; i <= 20000; i++) {
             sb.append("drop table ");
             sb.append("test_").append(i);
             int i1 = st.executeUpdate(sb.toString());

+ 5 - 6
transport/redis2taos/src/main/resources/banner.txt

@@ -1,6 +1,5 @@
-#####    ##   #####   ##           ##   #####    ##   #####  ##### ###### #####
-#    #  #  #    #    #  #         #  #  #    #  #  #  #    #   #   #      #    #
-#    # #    #   #   #    # ##### #    # #    # #    # #    #   #   #####  #    #
-#    # ######   #   ######       ###### #    # ###### #####    #   #      #####
-#    # #    #   #   #    #       #    # #    # #    # #        #   #      #   #
-#####  #    #   #   #    #       #    # #####  #    # #        #   ###### #    #
+redis2taos
+redis2taos
+redis2taos
+redis2taos
+redis2taos