揭秘:大厂面试必考题,常常出现在第二轮

本文介绍了如何使用SpringBoot构建一个秒杀系统,涉及到数据库建表、秒杀活动及商品表的设计,以及如何处理高并发下的库存扣减问题。通过Spring-Mybatis框架编写DAO层接口,并展示了相关的Java代码示例,包括Seckill实体类、SeckillMapper接口和测试类。文章还强调了实际开发中需要考虑的性能优化和并发控制策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请听题。

假设你是一个资深程序员,已创建完成了SpringBoot项目,需要使用SpringBoot模拟实现电商平台秒杀场景,100万人在线下单抢购一个3000库存量的半价化妆品。

请用Java写出秒杀系统建表SQL和注意事项

(这是一道送分题,思索片刻。)

下面给出答案示例:

CREATE TABLE `tb_seckill` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '秒杀活动ID',  `name` varchar(50) NOT NULL COMMENT '秒杀活动名称',  `start_time` datetime NOT NULL COMMENT '秒杀开始时间',  `end_time` datetime NOT NULL COMMENT '秒杀结束时间',  `total` int(11) NOT NULL COMMENT '商品总量',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='秒杀活动表'; CREATE TABLE `tb_seckill_item` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '秒杀活动商品ID',  `seckill_id` bigint(20) NOT NULL COMMENT '秒杀活动ID',  `item_id` bigint(20) NOT NULL COMMENT '商品ID',  `price` decimal(10,2) NOT NULL COMMENT '秒杀价格',  `stock_count` int(11) NOT NULL COMMENT '商品库存量',  `start_time` datetime NOT NULL COMMENT '秒杀开始时间',  `end_time` datetime NOT NULL COMMENT '秒杀结束时间',  PRIMARY KEY (`id`),  KEY `idx_seckill_id` (`seckill_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='秒杀活动商品表';

上述建表SQL创建了两张表:tb_seckill(秒杀活动表)和tb_seckill_item(秒杀活动商品表),其中:

tb_seckill表用于存储秒杀活动的基本信息,包括活动ID、名称、开始时间、结束时间和商品总量等。

tb_seckill_item表用于存储秒杀活动商品的信息,包括商品ID、秒杀价格、库存量、开始时间、结束时间和所属的秒杀活动ID等。

需要注意的是,对于秒杀场景而言,高并发是不可避免的,因此在建表时需要考虑如何优化数据库性能。

以下是一些建议:

  1. 尽量避免使用全表扫描、索引失效和大事务等问题,可以使用合适的索引、拆分表和分库分表等技术来解决。

  2. 合理设置表结构和数据类型,避免浪费存储空间和影响查询性能。

  3. 使用适当的缓存和预热技术,可以提高数据库的并发处理能力和性能。

  4. 使用乐观锁和悲观锁等机制,避免数据冲突和并发问题。

在实际的开发过程中,还需要根据具体的业务需求和性能要求进行优化和调整。 

接下来,我们需要使用Spring-Mybatis框架,提供一个interface接口。其他和数据库交互的SQL编写放到对应的XML文件中,开始DAO层接口的编写。

以下是使用Spring-Mybatis框架编写DAO层接口的示例:

首先,我们需要在Spring Boot项目中添加MyBatis依赖,例如:

org.mybatis.spring.bootmybatis-spring-boot-starter 2.2.0

然后,在src/main/resources目录下创建MyBatis的XML配置文件和Mapper接口,例如:

1.src/main/resources/mybatis-config.xml配置文件     

2.src/main/resources/mapper/SeckillMapper.xml文件

UPDATE tb_seckill_itemSET stock_count = stock_count - #{quantity}WHERE id = #{itemId}AND stock_count > 0 

3.src/main/resources/mapper/SeckillItemMapper.xml文件

4.com.example.demo.dao.SeckillMapper接口 

public interface SeckillMapper {    Seckill queryById(Long id);    int reduceStockCount(MapparamMap);

5.com.example.demo.dao.SeckillItemMapper接口

kotlinpublic interface SeckillItemMapper {    SeckillItem queryById(Long id);

现在,我们使用IDEA开发工具,打开接口文件。并用Java创建 SeckillMapper接口的测试文件:SeckillMapperTest.java

那么,为了实现电商平台的秒杀场景,我们需要完成以下步骤:

创建一个名为Seckill的实体类,用于表示秒杀商品,包括商品的ID、名称、库存数量、开始时间和结束时间等属性。

public class Seckill {    private Long id; // 商品ID    private String name; // 商品名称    private Integer stock; // 商品库存    private Date startTime; // 秒杀开始时间    private Date endTime; // 秒杀结束时间    // 省略getter和setter方法}

创建一个名为SeckillMapper的Mapper接口,用于操作秒杀商品表。其中,包括根据ID查询商品、减少商品库存等方法。

@Mapperpublic interface SeckillMapper {    /**     * 根据ID查询秒杀商品     * @param id 商品ID     * @return 秒杀商品     */    Seckill selectById(Long id);     /**     * 减少商品库存     * @param seckill 秒杀商品     * @return 更新记录数,如果更新成功返回1,否则返回0     */    int reduceStock(Seckill seckill);}

在application.yml文件中配置数据源和Mybatis,如下所示:

spring:datasource:url: jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xml

创建一个名为SeckillMapperTest的测试类,用于测试SeckillMapper接口的正确性。

@RunWith(SpringRunner.class)@SpringBootTestpublic class SeckillMapperTest {     @Autowired    private SeckillMapper seckillMapper;    @Test    public void testSelectById() {        Long id = 1L;        Seckill seckill = seckillMapper.selectById(id);        assertNotNull(seckill);        assertEquals(id, seckill.getId());    }     @Test    public void testReduceStock() {        Long id = 1L;        Seckill seckill = seckillMapper.selectById(id);        assertNotNull(seckill);        int affectedRows = seckillMapper.reduceStock(seckill);        assertEquals(1, affectedRows);    }}

在这个测试类中,我们注入了SeckillMapper接口,并测试了selectById和reduceStock两个方法的正确性。其中,testSelectById方法测试了根据ID查询商品的正确性,testReduceStock方法测试了减少商品库存的正确性。

以上就是使用SpringBoot模拟实现电商平台秒杀场景的详细说明和Java代码示例。需要注意的是,在实际开发中,您还需要完成其他方面的工作,比如实现秒杀商品的展示、下单、支付等功能,保证整个电商平台的正常运行。 

同时,作为大厂的面试必考题,常常出现在第二轮,相信你在LEEDCODE刷题的同时,也会时常关注和探讨码农的生态与职业生涯规划。

关注我👈

涨IT姿势👈

找远程工作👈

赴日工作内推👈

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值