7.22 数据缓存与缓存降级

This commit is contained in:
zhangsan 2025-07-22 20:54:23 +08:00
parent 42f05b1608
commit ca163978f2
7 changed files with 140 additions and 5 deletions

View File

@ -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"

View File

@ -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<String> stringSupplier = () -> "Hello, smile!";
// 使用 get() 方法获取 Supplier 提供的值
String result = stringSupplier.get();
// 输出结果
System.out.println(result);
// 另一个示例使用 Supplier 提供当前时间
Supplier<Long> currentTimeSupplier = System::currentTimeMillis;
// 获取当前时间
Long currentTime = currentTimeSupplier.get();
// 输出当前时间
System.out.println("Current time in milliseconds: " + currentTime);
}
}

View File

@ -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 <T> 返回类型
* @return 查询结果
*/
protected <T> T getFromCacheOrDb(String cacheKey, Supplier<T> 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 <T> 返回类型
* @return 查询结果
*/
protected <T> T getFromCacheOrDb(String cacheKey, Supplier<T> 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();
}
}
}

View File

@ -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()

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}