7.22 数据缓存与缓存降级
This commit is contained in:
parent
42f05b1608
commit
ca163978f2
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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()
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user