7.22 数据缓存与缓存降级
This commit is contained in:
parent
42f05b1608
commit
ca163978f2
@ -53,7 +53,7 @@ public class DCCValueBeanFactory implements BeanPostProcessor {
|
|||||||
*/
|
*/
|
||||||
@Bean("dccTopic")
|
@Bean("dccTopic")
|
||||||
public RTopic dccRedisTopicListener(RedissonClient redissonClient) {
|
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) -> {
|
topic.addListener(String.class, (channel, message) -> {
|
||||||
// message 示例: "cutRange:30"
|
// message 示例: "cutRange:30"
|
||||||
|
@ -10,6 +10,7 @@ import org.springframework.test.context.junit4.SpringRunner;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@ -36,5 +37,25 @@ public class ApiTest {
|
|||||||
countDownLatch.await();
|
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
|
@Repository
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class ActivityRepository implements IActivityRepository {
|
public class ActivityRepository extends AbstractRepository implements IActivityRepository {
|
||||||
|
|
||||||
private final IGroupBuyActivityDao groupBuyActivityDao;
|
private final IGroupBuyActivityDao groupBuyActivityDao;
|
||||||
|
|
||||||
@ -45,12 +45,17 @@ public class ActivityRepository implements IActivityRepository {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GroupBuyActivityDiscountVO queryGroupBuyActivityDiscountVO(Long activityId) {
|
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;
|
if (null == groupBuyActivityRes) return null;
|
||||||
|
|
||||||
String discountId = groupBuyActivityRes.getDiscountId();
|
String discountId = groupBuyActivityRes.getDiscountId();
|
||||||
|
|
||||||
GroupBuyDiscount groupBuyDiscountRes = groupBuyDiscountDao.queryGroupBuyActivityDiscountByDiscountId(discountId);
|
// 优先从缓存获取&写缓存
|
||||||
|
GroupBuyDiscount groupBuyDiscountRes = getFromCacheOrDb(GroupBuyDiscount.cacheRedisKey(discountId),
|
||||||
|
() -> groupBuyDiscountDao.queryGroupBuyActivityDiscountByDiscountId(discountId));
|
||||||
if (null == groupBuyDiscountRes) return null;
|
if (null == groupBuyDiscountRes) return null;
|
||||||
|
|
||||||
GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount = GroupBuyActivityDiscountVO.GroupBuyDiscount.builder()
|
GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount = GroupBuyActivityDiscountVO.GroupBuyDiscount.builder()
|
||||||
|
@ -46,5 +46,8 @@ public class GroupBuyActivity {
|
|||||||
private Date createTime;
|
private Date createTime;
|
||||||
/** 更新时间 */
|
/** 更新时间 */
|
||||||
private Date updateTime;
|
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
|
* 折扣ID
|
||||||
*/
|
*/
|
||||||
private Integer discountId;
|
private String discountId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 折扣标题
|
* 折扣标题
|
||||||
@ -66,4 +66,8 @@ public class GroupBuyDiscount {
|
|||||||
*/
|
*/
|
||||||
private Date updateTime;
|
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")
|
@DCCValue("scBlacklist:s02c02,s03c03")
|
||||||
private String scBlacklist;
|
private String scBlacklist;
|
||||||
|
|
||||||
|
@DCCValue("cacheSwitch:1")
|
||||||
|
private String cacheOpenSwitch;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否降级
|
* 判断是否降级
|
||||||
* @return
|
* @return
|
||||||
@ -63,4 +66,11 @@ public class DCCService {
|
|||||||
return list.contains(source + channel);
|
return list.contains(source + channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存开启开关,true为开启,0为关闭
|
||||||
|
*/
|
||||||
|
public boolean isCacheOpenSwitch(){
|
||||||
|
return "1".equals(cacheOpenSwitch);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user