From 58cb64814f71c327dfc8194f76a22c8f5962574b Mon Sep 17 00:00:00 2001 From: wanghu Date: Mon, 17 Aug 2026 09:21:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=91=BD=E4=B8=AD=E6=B1=A1?= =?UTF-8?q?=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BaseSchsystemGradeService.java | 19 ++++++++++-- .../service/impl/BaseSchsystemService.java | 31 ++++++++++++++----- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemGradeService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemGradeService.java index cd6e7cc..35be569 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemGradeService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemGradeService.java @@ -41,17 +41,30 @@ public class BaseSchsystemGradeService implements IBaseSchsystemGradeService { String cacheKey = RedisConstants.SCHOOL_GRAGE+"_"+schId; - if (redisUtil.hasKey(cacheKey)) - return redisUtil.getList(cacheKey,BaseSchsystemGrade.class); + // 空结果(null 或 空列表)视为未命中,回源 DB,避免空缓存长期毒化 + List cached = redisUtil.getList(cacheKey, BaseSchsystemGrade.class); + if (cached != null && !cached.isEmpty()) { + return cached; + } List schsystemIds= schBinSchsystemService.getSchBinSchsystemIds(schId); List list=baseSchsystemGradeRepository.findBySchSystemIdIn(schsystemIds); - redisUtil.set(cacheKey, list , RedisConstants.CACHE_EXPIRE_30D); + // 仅缓存非空结果 + if (!list.isEmpty()) { + redisUtil.set(cacheKey, list , RedisConstants.CACHE_EXPIRE_30D); + } return list; } + /** + * 学校学制年级数据变更后调用:清除指定学校的学制年级缓存 + */ + public void clearSchGradeCache(Integer schId) { + redisUtil.del(RedisConstants.SCHOOL_GRAGE + "_" + schId); + } + public List getSchGradeCacheList(Integer schId,Integer schsystemId,Integer gradeId) { List list = getSchGradeCacheList(schId); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemService.java index fbcd9df..bb54ea3 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseSchsystemService.java @@ -27,21 +27,36 @@ public class BaseSchsystemService implements IBaseSchsystemService { public List getSchsystemList() { String cacheKey = RedisConstants.SYSTEM_SCHSYSTEM; - if (redisUtil.hasKey(cacheKey)) - return redisUtil.getList(cacheKey,BaseSchsystem.class); + // 1. 先读缓存;空结果(null 或 空列表)视为未命中,强制回源 DB, + // 避免“冷启动时把 [] 写进缓存后长期毒化”的问题 + List cached = redisUtil.getList(cacheKey, BaseSchsystem.class); + if (cached != null && !cached.isEmpty()) { + return cached; + } - //加锁防止缓存击穿 + // 2. 加锁防止缓存击穿 + 双重检查 synchronized (this) { - // 双重检查 - if (redisUtil.hasKey(cacheKey)) - return redisUtil.getList(cacheKey,BaseSchsystem.class); + cached = redisUtil.getList(cacheKey, BaseSchsystem.class); + if (cached != null && !cached.isEmpty()) { + return cached; + } // 3. 从数据库查询 List list = baseSchSystemRepository.findAll(); - // 4. 存入缓存(即使是空列表也缓存,避免穿透) - redisUtil.set(cacheKey, list, RedisConstants.CACHE_EXPIRE_30D); + + // 4. 仅缓存非空结果;空结果不缓存,防止空缓存污染(穿透风险可忽略) + if (!list.isEmpty()) { + redisUtil.set(cacheKey, list, RedisConstants.CACHE_EXPIRE_30D); + } return list; } } + /** + * 学制数据变更后调用:清除学制列表缓存(base_sch_system 写入/更新/删除时触发) + */ + public void clearSchsystemCache() { + redisUtil.del(RedisConstants.SYSTEM_SCHSYSTEM); + } + }