我是靠谱客的博主 凶狠手机,最近开发中收集的这篇文章主要介绍简单秒杀系统中的redis限时抢购,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

为什么要限时?

上一篇文章介绍了如何在大数据量用户的请求下对请求数量做限制,也就是接口限流。在实际的秒杀中,除了要考虑接口限流外,还要考虑即使用户通过了令牌桶算法的限流,但是也可能在要秒杀商品的时候(开始调用秒杀业务的时候),已经超过了进行秒杀的时间了,因为实际生活中秒杀都是有一定的时间限制,如何限制用户在规定的时间内进行秒杀,超过时间了活动结束?=============》秒杀系统使用的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限时抢购所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部