概述
为什么要限时?
上一篇文章介绍了如何在大数据量用户的请求下对请求数量做限制,也就是接口限流。在实际的秒杀中,除了要考虑接口限流外,还要考虑即使用户通过了令牌桶算法的限流,但是也可能在要秒杀商品的时候(开始调用秒杀业务的时候),已经超过了进行秒杀的时间了,因为实际生活中秒杀都是有一定的时间限制,如何限制用户在规定的时间内进行秒杀,超过时间了活动结束?=============》秒杀系统使用的redis做限时抢购
使用redis做限时抢购的大概过程
1.把要进行秒杀的商品提前在秒杀前放到redis里,并设置一定的过期时间(和具体的秒杀时间有关)【可以使用redis的String类型的数据结构,key=商品名称id+商品id,value=商品id】
2. 在spring boot导入redis和spring boot的整合包,并在配置文件中设置redis-server的地址和端口以及使用的数据库
3.在进行通过令牌桶算法限流后,调用秒杀操作前,判断redis中商品是否还存在,存在即此商品的秒杀活动还没有结束,不存在即秒杀活动已结束,不能再秒杀
使用redis做限时抢购
导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
配置文件
service.java
@Service
@Transactional
public class StockOrderServiceImpl implements StockOrderService {
@Resource
private StockDao stockDao;
@Resource
private StockOrderDao stockOrderDao;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public int kill(Integer id) {
//校验redis中秒杀商品是否超时,没有的话再进行秒杀,超时的话告诉用户秒杀时间已经截止
Boolean hasKey = stringRedisTemplate.hasKey("kill"+id);
if(!hasKey){
throw new RuntimeException("当前商品的抢购时间已截止");
}
//校验库存
Stock stock = checkStock(id);
//更新库存
updateSale(stock);
//创建订单
int orderId = createOrder(stock);
return orderId;
}
//校验库存
public Stock checkStock(Integer id) {
//根据商品id校验库存
Stock stockEntity = stockDao.checkStock(id);
if (stockEntity.getCount() == stockEntity.getSale()) {
//不能再秒杀
throw new RuntimeException("抢光了");
}
return stockEntity;
}
//扣除库存,
public void updateSale(Stock stockEntity) {
//继续秒杀,扣除库存
//在sql层面完成销量的+1和版本号的+1,并且根据商品id和版本号同时查询更新的商品
// stockEntity.setSale(stockEntity.getSale());
int reslut = stockDao.updateSale(stockEntity);
if(reslut == 0){
throw new RuntimeException("抢购失败,请重试");
}
}
//创建订单
public int createOrder(Stock stockEntity) {
//创建订单
StockOrder stockOrder = new StockOrder();
stockOrder.setSID(stockEntity.getId())
.setCreateTime(new Date())
.setName(stockEntity.getName());
//mybatis可以自动把生成的主键放到此对象里
stockOrderDao.createOrder(stockOrder);
//得到数据库主键生成的Id
return stockOrder.getId();
}
}
最后
以上就是凶狠手机为你收集整理的简单秒杀系统中的redis限时抢购的全部内容,希望文章能够帮你解决简单秒杀系统中的redis限时抢购所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复