JAVA全系列 教程
3762个小节阅读:7092.5k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
配置redis监听器
xxxxxxxxxx
/**
* 配置redis监听器
*/
@Configuration
public class RedisListenerConfig {
// 配置redis监听器,监听redis过期事件
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
创建redis监听类
xxxxxxxxxx
/**
* redis监听类继承KeyExpirationEventMessageListener
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private SeckillService seckillService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 订单过期后,关闭交易,回退商品库存
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 获取失效key,即订单id
String expiredKey = message.toString();
// 拿到复制订单信息
Orders orders = (Orders) redisTemplate.opsForValue().get(expiredKey + "_copy");
Long goodId = orders.getCartGoods().get(0).getGoodId(); // 产品id
Integer num = orders.getCartGoods().get(0).getNum(); // 产品数量
// 查询秒杀商品
SeckillGoods seckillGoods = seckillService.findSeckillGoodsByRedis(goodId);
// 回退库存
seckillGoods.setStockCount(seckillGoods.getStockCount() + num);
redisTemplate.boundHashOps("seckillGoods").put(goodId, seckillGoods);
// 删除复制订单数据
redisTemplate.delete(expiredKey+"_copy");
}
}
修改支付代码,支付时删除复制订单
xxxxxxxxxx
@Override
public Orders pay(String orderId) {
// 1.查询订单,设置相应数据
Orders orders = (Orders) redisTemplate.opsForValue().get(orderId);
if (orders == null){
throw new BusException(CodeEnum.ORDER_EXPIRED_ERROR);
}
orders.setStatus(2);
orders.setPaymentTime(new Date());
orders.setPaymentType(2); // 支付宝支付
// 2.从redis删除订单
redisTemplate.delete(orderId);
redisTemplate.delete(orderId+"_copy");
// 3.返回订单数据
return orders;
}
这样生成订单时还会生成一个复制订单,订单数据过期触发过期事件,在过期事件中找到订单的复制订单,从复制订单中拿到商品数据,对商品进行回退库存。