From 3fa8dfa1ca51f8252889fe0022594fb8bb4e7e60 Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 13 Jun 2025 00:53:33 +0800 Subject: [PATCH] feat(service): Optimize data query efficiency through cache --- .../common/core/base/service/BaseService.java | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) 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 ec81557..1e3bde9 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 @@ -23,8 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static com.bgasol.common.constant.value.RedisConfigValues.DEFAULT_TIME_UNIT; @@ -265,6 +264,38 @@ public abstract class BaseService findIds(String... ids) { + // 优先从缓存查询结果 + if (ObjectUtils.isEmpty(commonBaseRedissonClient())) { + return commonBaseMapper().selectByIds(Arrays.asList(ids)); + } + + // 先获取缓存中的结果 + RMapCache mapCache = getRMapCache(); + Map cacheList = mapCache.getAll(Set.of(ids)); + + // 缓存中没有的查询数据库 + List noneCacheIds = Arrays.stream(ids).filter(id -> !cacheList.containsKey(id)).toList(); + List entities = commonBaseMapper().selectByIds(noneCacheIds); + + // 准备缓存的新数据 数据库中也没有查到的数据制作为NULL_PLACEHOLDER实体 + Map toCacheDate = noneCacheIds.stream().collect(Collectors.toMap(id -> id, + id -> entities.stream().filter(entity -> entity.getId().equals(id)).findFirst().orElse( + (ENTITY) BaseEntity.builder().id(NULL_PLACEHOLDER).build())) + ); + // 将数据库查询的结果,缓存到redis中 + mapCache.putAll(toCacheDate, randomizeTtl(), DEFAULT_TIME_UNIT); + + + // 合并缓存和数据库的结果 (将防止缓存穿透的空对象扔掉) + List result = new ArrayList<>(cacheList.values().stream().filter(entity -> !entity.getId().equals(NULL_PLACEHOLDER)).toList()); + result.addAll(entities); + + this.findOtherTable(result); + return result; + } + /** * 分页查询 * @@ -373,7 +404,7 @@ public abstract class BaseService list) { - if (list == null || list.isEmpty()) { + if (ObjectUtils.isEmpty(list)) { return; } @@ -431,10 +462,9 @@ public abstract class BaseService mapCache = getRMapCache(); + mapCache.remove(id); } - RMapCache mapCache = getRMapCache(); - mapCache.remove(id); } }