From e6b2a76bef07fc98dfaa52dda4663f0bd92e62b4 Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 11 Jun 2025 10:02:22 +0800 Subject: [PATCH] fix(common): Fix cache penetration issue --- .../common/core/base/entity/BaseEntity.java | 2 +- .../common/core/base/service/BaseService.java | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cloud/common/common-base-model/src/main/java/com/bgasol/common/core/base/entity/BaseEntity.java b/cloud/common/common-base-model/src/main/java/com/bgasol/common/core/base/entity/BaseEntity.java index fac72be..5c1d385 100644 --- a/cloud/common/common-base-model/src/main/java/com/bgasol/common/core/base/entity/BaseEntity.java +++ b/cloud/common/common-base-model/src/main/java/com/bgasol/common/core/base/entity/BaseEntity.java @@ -17,7 +17,7 @@ import java.util.Date; @SuperBuilder @NoArgsConstructor @MappedSuperclass -public abstract class BaseEntity implements Serializable { +public class BaseEntity implements Serializable { @Id @TableId(value = "id", type = IdType.ASSIGN_UUID) @OrderBy(asc = true, sort = 33) diff --git a/cloud/common/common-base-web/src/main/java/com/bgasol/common/core/base/service/BaseService.java b/cloud/common/common-base-web/src/main/java/com/bgasol/common/core/base/service/BaseService.java index d7ba631..7f5aaab 100644 --- a/cloud/common/common-base-web/src/main/java/com/bgasol/common/core/base/service/BaseService.java +++ b/cloud/common/common-base-web/src/main/java/com/bgasol/common/core/base/service/BaseService.java @@ -370,6 +370,8 @@ public abstract class BaseService mapCache = getRMapCache(); if (mapCache.containsKey(id)) { - return mapCache.get(id); + ENTITY entity = mapCache.get(id); + if (entity.getId().equals(NULL_PLACEHOLDER)) { + return null; + } else { + return entity; + } } else { ENTITY entity = commonBaseMapper().selectById(id); - // 不论是否为null,都要缓存 防止穿透 - mapCache.put(id, entity, 10, TimeUnit.MINUTES); + // 如果是null就存储一个id为"null"的字符串做标记 防止穿透 + if (entity == null) { + mapCache.put(id, (ENTITY) BaseEntity.builder().id(NULL_PLACEHOLDER).build(), 10, TimeUnit.MINUTES); + } else { + mapCache.put(id, entity, 10, TimeUnit.MINUTES); + } return entity; } }