From 0b024a849afdda15ff37df4710a4f103ac1a70cf Mon Sep 17 00:00:00 2001 From: yukaidi Date: Thu, 28 May 2026 23:20:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E8=A1=A8=E5=AE=9A=E6=97=B6=E6=B8=85=E7=90=86=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=20cache=5Flink=5Finfo=20=E6=97=A0?= =?UTF-8?q?=E9=99=90=E5=A2=9E=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CacheManager 添加 cleanupExpiredCache() 方法删除过期缓存记录 - PostExecVerticle 注册每小时执行一次的定时清理任务 - 原实现只有读时惰性检查过期,过期记录永远不会被删除,长期运行后数据库持续膨胀 --- .../vx/core/verticle/PostExecVerticle.java | 14 +++++++++-- .../cn/qaiu/lz/common/cache/CacheManager.java | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/cn/qaiu/vx/core/verticle/PostExecVerticle.java b/core/src/main/java/cn/qaiu/vx/core/verticle/PostExecVerticle.java index 8cfa6d4..92ddb1f 100644 --- a/core/src/main/java/cn/qaiu/vx/core/verticle/PostExecVerticle.java +++ b/core/src/main/java/cn/qaiu/vx/core/verticle/PostExecVerticle.java @@ -46,7 +46,7 @@ public class PostExecVerticle extends AbstractVerticle { return; } LOGGER.info("PostExecVerticle 开始执行..."); - + if (appRunImplementations != null && !appRunImplementations.isEmpty()) { appRunImplementations.forEach(appRun -> { try { @@ -61,7 +61,17 @@ public class PostExecVerticle extends AbstractVerticle { } else { LOGGER.info("未找到 AppRun 接口的实现类"); } - + + // 注册定时清理过期缓存任务(每小时执行一次) + vertx.setPeriodic(3600_000, 3600_000, id -> { + try { + cn.qaiu.lz.common.cache.CacheManager cacheManager = new cn.qaiu.lz.common.cache.CacheManager(); + cacheManager.cleanupExpiredCache(); + } catch (Exception e) { + LOGGER.debug("定时清理缓存任务跳过(数据库可能未就绪)", e); + } + }); + LOGGER.info("PostExecVerticle 执行完成"); startPromise.complete(); } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java b/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java index 90cf3a7..d460b06 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java @@ -200,6 +200,31 @@ public class CacheManager { return promise.future(); } + /** + * 清理过期缓存记录,防止数据库无限增长 + * @return 删除的行数 + */ + public Future cleanupExpiredCache() { + String sql = "DELETE FROM cache_link_info WHERE expiration > 0 AND expiration < #{now}"; + Map params = new HashMap<>(); + params.put("now", System.currentTimeMillis()); + Promise promise = Promise.promise(); + SqlTemplate.forUpdate(jdbcPool, sql) + .execute(params) + .onSuccess(res -> { + int deleted = res.rowCount(); + if (deleted > 0) { + LOGGER.info("清理过期缓存记录 {} 条", deleted); + } + promise.complete(deleted); + }) + .onFailure(e -> { + LOGGER.error("清理过期缓存失败", e); + promise.fail(e); + }); + return promise.future(); + } + public Future> getShareKeyTotal(String shareKey) { String sql = """ SELECT `share_key`, SUM(cache_hit_total) AS hit_total, SUM(api_parser_total) AS parser_total