From 5f5b48f0c12fc7518030f5aa62393c8dfec5662e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 18 三月 2026 11:09:39 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/task/DeviceLogScheduler.java |   36 +++++++++++++++++++++++++++++++++---
 1 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/core/task/DeviceLogScheduler.java b/src/main/java/com/zy/core/task/DeviceLogScheduler.java
index 8f5ff54..6c36495 100644
--- a/src/main/java/com/zy/core/task/DeviceLogScheduler.java
+++ b/src/main/java/com/zy/core/task/DeviceLogScheduler.java
@@ -25,6 +25,7 @@
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.List;
 import java.util.ArrayList;
@@ -36,6 +37,10 @@
 @Slf4j
 @Component
 public class DeviceLogScheduler {
+
+    private static final int BASE_BATCH_SIZE = 100;
+    private static final int BACKLOG_SCAN_LIMIT = 2000;
+    private static final int MAX_BATCH_SIZE = 1000;
 
     @Value("${deviceLogStorage.type}")
     private String storageType;
@@ -70,11 +75,11 @@
 
     @Scheduled(cron = "0/3 * * * * ? ")
     public void execute() {
-        int maxCount = 100;
-        Set<String> keys = redisUtil.scanKeys(RedisKeyType.DEVICE_LOG_KEY.key, maxCount);
-        if (keys == null || keys.isEmpty()) {
+        Set<String> scannedKeys = redisUtil.scanKeys(RedisKeyType.DEVICE_LOG_KEY.key, BACKLOG_SCAN_LIMIT);
+        if (scannedKeys == null || scannedKeys.isEmpty()) {
             return;
         }
+        Set<String> keys = selectBatchKeys(scannedKeys);
         List<Object> values = redisUtil.multiGet(keys);
         List<DeviceDataLog> list = new ArrayList<>();
         for (Object object : values) {
@@ -100,6 +105,31 @@
         }
     }
 
+    private Set<String> selectBatchKeys(Set<String> scannedKeys) {
+        int backlog = scannedKeys.size();
+        int batchSize = resolveBatchSize(backlog);
+        if (backlog <= batchSize) {
+            return scannedKeys;
+        }
+        LinkedHashSet<String> selected = new LinkedHashSet<>();
+        for (String key : scannedKeys) {
+            selected.add(key);
+            if (selected.size() >= batchSize) {
+                break;
+            }
+        }
+        return selected;
+    }
+
+    private int resolveBatchSize(int backlog) {
+        if (backlog <= BASE_BATCH_SIZE) {
+            return backlog;
+        }
+        int adaptive = Math.max(BASE_BATCH_SIZE, backlog / 2);
+        int rounded = ((adaptive + BASE_BATCH_SIZE - 1) / BASE_BATCH_SIZE) * BASE_BATCH_SIZE;
+        return Math.min(MAX_BATCH_SIZE, rounded);
+    }
+
     private void mysqlSave(Set<String> keys, List<DeviceDataLog> list) {
         if (deviceDataLogService.saveBatch(list)) {
             redisUtil.del(keys.toArray(new String[0]));

--
Gitblit v1.9.1