From fd82105a3dfe347c4c9acb0410c117d8d67c9339 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 18 三月 2026 10:40:16 +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