From ca163978f292531b8b502f7bc79d31337120628a Mon Sep 17 00:00:00 2001 From: zhangsan <646228430@qq.com> Date: Tue, 22 Jul 2025 20:54:23 +0800 Subject: [PATCH] =?UTF-8?q?7.22=20=E6=95=B0=E6=8D=AE=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E4=B8=8E=E7=BC=93=E5=AD=98=E9=99=8D=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edu/whut/config/DCCValueBeanFactory.java | 2 +- .../src/test/java/edu/whut/test/ApiTest.java | 21 +++++ .../repository/AbstractRepository.java | 92 +++++++++++++++++++ .../repository/ActivityRepository.java | 11 ++- .../dao/po/GroupBuyActivity.java | 3 + .../dao/po/GroupBuyDiscount.java | 6 +- .../whut/infrastructure/dcc/DCCService.java | 10 ++ 7 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/AbstractRepository.java diff --git a/group-buying-sys-app/src/main/java/edu/whut/config/DCCValueBeanFactory.java b/group-buying-sys-app/src/main/java/edu/whut/config/DCCValueBeanFactory.java index 15f5512..6662b78 100644 --- a/group-buying-sys-app/src/main/java/edu/whut/config/DCCValueBeanFactory.java +++ b/group-buying-sys-app/src/main/java/edu/whut/config/DCCValueBeanFactory.java @@ -53,7 +53,7 @@ public class DCCValueBeanFactory implements BeanPostProcessor { */ @Bean("dccTopic") public RTopic dccRedisTopicListener(RedissonClient redissonClient) { - RTopic topic = redissonClient.getTopic("group_buy_market_dcc"); + RTopic topic = redissonClient.getTopic("group_buy_market_dcc"); //只要有任何客户端往 group_buy_market_dcc 发布消息,这个监听回调就会被触发 topic.addListener(String.class, (channel, message) -> { // message 示例: "cutRange:30" diff --git a/group-buying-sys-app/src/test/java/edu/whut/test/ApiTest.java b/group-buying-sys-app/src/test/java/edu/whut/test/ApiTest.java index 134e587..00dd1ea 100644 --- a/group-buying-sys-app/src/test/java/edu/whut/test/ApiTest.java +++ b/group-buying-sys-app/src/test/java/edu/whut/test/ApiTest.java @@ -10,6 +10,7 @@ import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; import java.util.concurrent.CountDownLatch; +import java.util.function.Supplier; @Slf4j @RunWith(SpringRunner.class) @@ -36,5 +37,25 @@ public class ApiTest { countDownLatch.await(); } + @Test + public void test_Supplier(){ + // 创建一个 Supplier 实例,返回一个字符串 + Supplier stringSupplier = () -> "Hello, smile!"; + + // 使用 get() 方法获取 Supplier 提供的值 + String result = stringSupplier.get(); + + // 输出结果 + System.out.println(result); + + // 另一个示例,使用 Supplier 提供当前时间 + Supplier currentTimeSupplier = System::currentTimeMillis; + + // 获取当前时间 + Long currentTime = currentTimeSupplier.get(); + + // 输出当前时间 + System.out.println("Current time in milliseconds: " + currentTime); + } } diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/AbstractRepository.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/AbstractRepository.java new file mode 100644 index 0000000..9297090 --- /dev/null +++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/AbstractRepository.java @@ -0,0 +1,92 @@ +package edu.whut.infrastructure.adapter.repository; +import edu.whut.infrastructure.dcc.DCCService; +import edu.whut.infrastructure.redis.IRedisService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Resource; +import java.util.function.Supplier; + +/** + * 仓储抽象类 + */ +public abstract class AbstractRepository { + + private final Logger logger = LoggerFactory.getLogger(AbstractRepository.class); + + @Resource + protected IRedisService redisService; + + @Resource + protected DCCService dccService; + + /** + * 通用缓存处理方法 + * 优先从缓存获取,缓存不存在则从数据库获取并写入缓存 + * + * @param cacheKey 缓存键 + * @param dbFallback 数据库查询函数 + * @param 返回类型 + * @return 查询结果 + */ + protected T getFromCacheOrDb(String cacheKey, Supplier dbFallback) { + // 判断是否开启缓存 + if (dccService.isCacheOpenSwitch()) { + // 从缓存获取 + T cacheResult = redisService.getValue(cacheKey); + // 缓存存在则直接返回 + if (null != cacheResult) { + return cacheResult; + } + // 缓存不存在则从数据库获取 + T dbResult = dbFallback.get(); + // 数据库查询结果为空则直接返回 + if (null == dbResult) { + return null; + } + // 写入缓存 + redisService.setValue(cacheKey, dbResult); + return dbResult; + } else { + // 缓存未开启,直接从数据库获取 + logger.warn("缓存降级 {}", cacheKey); + return dbFallback.get(); + } + } + + /** + * 通用缓存处理方法(带过期时间) + * 优先从缓存获取,缓存不存在则从数据库获取并写入缓存 + * + * @param cacheKey 缓存键 + * @param dbFallback 数据库查询函数 + * @param expired 过期时间 + * @param 返回类型 + * @return 查询结果 + */ + protected T getFromCacheOrDb(String cacheKey, Supplier dbFallback, long expired) { + // 判断是否开启缓存 + if (dccService.isCacheOpenSwitch()) { + // 从缓存获取 + T cacheResult = redisService.getValue(cacheKey); + // 缓存存在则直接返回 + if (null != cacheResult) { + return cacheResult; + } + // 缓存不存在则从数据库获取 + T dbResult = dbFallback.get(); + // 数据库查询结果为空则直接返回 + if (null == dbResult) { + return null; + } + // 写入缓存(带过期时间) + redisService.setValue(cacheKey, dbResult, expired); + return dbResult; + } else { + // 缓存未开启,直接从数据库获取 + logger.warn("缓存降级 {}", cacheKey); + return dbFallback.get(); + } + } + +} diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java index 8e8da70..fdab222 100644 --- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java +++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java @@ -25,7 +25,7 @@ import java.util.stream.Collectors; @Repository @RequiredArgsConstructor @Slf4j -public class ActivityRepository implements IActivityRepository { +public class ActivityRepository extends AbstractRepository implements IActivityRepository { private final IGroupBuyActivityDao groupBuyActivityDao; @@ -45,12 +45,17 @@ public class ActivityRepository implements IActivityRepository { @Override public GroupBuyActivityDiscountVO queryGroupBuyActivityDiscountVO(Long activityId) { - GroupBuyActivity groupBuyActivityRes = groupBuyActivityDao.queryValidGroupBuyActivityId(activityId); + // 优先从缓存获取&写缓存,注意如果实现了后台配置,在更新时要更库,删缓存。 + // TODO:数据更新时更库,删缓存还未实现 + GroupBuyActivity groupBuyActivityRes = getFromCacheOrDb(GroupBuyActivity.cacheRedisKey(activityId), + () -> groupBuyActivityDao.queryValidGroupBuyActivityId(activityId)); if (null == groupBuyActivityRes) return null; String discountId = groupBuyActivityRes.getDiscountId(); - GroupBuyDiscount groupBuyDiscountRes = groupBuyDiscountDao.queryGroupBuyActivityDiscountByDiscountId(discountId); + // 优先从缓存获取&写缓存 + GroupBuyDiscount groupBuyDiscountRes = getFromCacheOrDb(GroupBuyDiscount.cacheRedisKey(discountId), + () -> groupBuyDiscountDao.queryGroupBuyActivityDiscountByDiscountId(discountId)); if (null == groupBuyDiscountRes) return null; GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount = GroupBuyActivityDiscountVO.GroupBuyDiscount.builder() diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyActivity.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyActivity.java index ef4d5b9..b14319e 100644 --- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyActivity.java +++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyActivity.java @@ -46,5 +46,8 @@ public class GroupBuyActivity { private Date createTime; /** 更新时间 */ private Date updateTime; + public static String cacheRedisKey(Long activityId) { + return "group_buy_market_edu.whut.infrastructure.dao.po.GroupBuyActivity_" + activityId; + } } diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyDiscount.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyDiscount.java index c738ec6..a605604 100644 --- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyDiscount.java +++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/GroupBuyDiscount.java @@ -24,7 +24,7 @@ public class GroupBuyDiscount { /** * 折扣ID */ - private Integer discountId; + private String discountId; /** * 折扣标题 @@ -66,4 +66,8 @@ public class GroupBuyDiscount { */ private Date updateTime; + public static String cacheRedisKey(String discountId) { + return "group_buy_market_edu.whut.infrastructure.dao.po.GroupBuyDiscount_" + discountId; + } + } diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java index c95c476..350a15e 100644 --- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java +++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java @@ -32,6 +32,9 @@ public class DCCService { @DCCValue("scBlacklist:s02c02,s03c03") private String scBlacklist; + @DCCValue("cacheSwitch:1") + private String cacheOpenSwitch; + /** * 判断是否降级 * @return @@ -63,4 +66,11 @@ public class DCCService { return list.contains(source + channel); } + /** + * 缓存开启开关,true为开启,0为关闭 + */ + public boolean isCacheOpenSwitch(){ + return "1".equals(cacheOpenSwitch); + } + }