JAVA全系列 教程
3762个小节阅读:7088.8k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
用户秒杀会修改redis中的商品库存,而此时mysql中的库存是没有修改的。等到下次同步数据的时候,redis中的库存数就又成了mysql中没有修改过的库存了,所以出现了秒杀商品库存不变的Bug。
为了保证数据的同步,我们在将数据库数据同步到redis之前,先将redis中的商品库存数据同步到数据库中。
修改同步秒杀商品到redis方法:
xxxxxxxxxx
/**
* 每分钟查询一次数据库,更新redis中的秒杀商品数据
* 条件为startTime < 当前时间 < endTime,库存大于0
*/
@Scheduled(cron = "0/5 * * * * *")
public void refreshRedis() {
// 将redis中秒杀商品的库存数据同步到mysql
List<SeckillGoods> seckillGoodsListOld = redisTemplate.boundHashOps("seckillGoods").values();
for (SeckillGoods seckillGoods : seckillGoodsListOld) {
// 在数据库查询秒杀商品
QueryWrapper<SeckillGoods> queryWrapper = new QueryWrapper();
queryWrapper.eq("goodsId",seckillGoods.getGoodsId());
SeckillGoods sqlSeckillGoods = seckillGoodsMapper.selectOne(queryWrapper);
if (sqlSeckillGoods != null){
// 修改数据库中秒杀商品的库存,和redis中的库存保持一致
sqlSeckillGoods.setStockCount(seckillGoods.getStockCount());
seckillGoodsMapper.updateById(sqlSeckillGoods);
}
}
// 1.查询数据库中正在秒杀的商品
QueryWrapper<SeckillGoods> queryWrapper = new QueryWrapper();
Date date = new Date();
String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
queryWrapper.le("startTime", now) // 当前时间晚于开始时间
.ge("endTime", now) // 当前时间早于开始时间
.gt("stockCount", 0); // 库存大于0
List<SeckillGoods> seckillGoodsList = seckillGoodsMapper.selectList(queryWrapper);
// 2.删除之前的秒杀商品
redisTemplate.delete("seckillGoods");
// 3.保存现在正在秒杀的商品
for (SeckillGoods seckillGoods : seckillGoodsList) {
redisTemplate.boundHashOps("seckillGoods").put(seckillGoods.getGoodsId(), seckillGoods);
}
}