小型秒杀项目使用乐观锁防止超卖

本文介绍了如何设计一个小型秒杀项目,通过乐观锁防止超卖并结合令牌桶算法进行限流。文章详细阐述了数据库表设计、悲观锁与乐观锁的超卖解决方案,接口限流的必要性以及令牌桶算法的应用,并讨论了如何隐藏秒杀接口以及限制单用户访问频率。
摘要由CSDN通过智能技术生成

项目介绍: 小型秒杀项目。采用乐观锁防止超卖+令牌桶算法限流+md5签名+单用户频率访问限制。
项目地址: SmallSecKill

主要参考: 如何基于springboot优雅设计一个秒杀系统乐观锁解决超卖、Redis缓存、令牌桶桶限流等方案,已完结!

前期准备

在数据库创建两张表
  • 库存表 stock

    DROP TA`seckill`BLE IF EXISTS `stock`;
    CREATE TABLE `stock`(
      `id` int(11) unsigned not null auto_increment,
      `name` varchar(50) not null default '' comment '名称',
      `count` int(11) not null comment '库存',
      `sale` int(11) not null comment '已售',
      `version` int(11) not null comment '版本号',
      primary key(`id`)
    )engine=InnoDB DEFAULT CHARSET=utf8;
    
  • 订单表 order

    DROP TABLE IF EXISTS `stock_order`;
    CREATE TABLE `stock_order`(
        `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        `sid` INT(11) NOT NULL COMMENT '库存ID',
        `name` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '商品名称',`stock_order`
        `create_name` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
        PRIMARY KEY(`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
安装依赖
  • mysql、mybatis

     <dependency>
         <groupId>org.mybatis.spring.boot</groupId>
         <artifactId>mybatis-spring-boot-starter</artifactId>
         <version>2.1.3</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
        <optional>true</optional>
    </dependency>
    
    <!--数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.21</version>
    </dependency>
    
创建 controller、dao、entity、service包,编写相关文件
  • 具体参考视频即可。
安装jmeter工具
  • 具体参考视频。
  • 运行命令:jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

超卖问题及解决方法

  • 出现原因:并发的线程数量远远高于实际的库存数量,在不加锁的情况下,会出现超卖问题。

  • 秒杀代码:

    @Service
    @Transactional
    public class OrderServiceImpl implements OrderService{
         
    
        @Autowired
        private StockDAO stockDAO;
    
        @Autowired
        private OrderDAO orderDAO;
    
        @Override
        public int seckill(Integer id) {
         
            //根据商品id校验库存
            Stock stock = stockDAO.checkStock(id);
            if(stock.getSale().equals(stock.getCount())){
         
                throw new RuntimeException("库存不足");
            }else{
         
                //扣除库存
                stock.setSale(stock.getSale()+1);
                stockDAO.updateSale(stock);
                //创建订单
                Order order = new Order();
                order.setSid(stock.getId()).setName(stock.getName()).setCreateDate(new Date());
                orderDAO.createOrder(order);
                return order.getId(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值