当前位置: 首页 > java >正文

Java秒杀功能-案例

数据库表设计

CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL,`password` varchar(100) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `order_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`goods_id` bigint(20) NOT NULL,`goods_name` varchar(100) NOT NULL,`goods_count` int(11) NOT NULL DEFAULT '1',`goods_price` decimal(10,2) NOT NULL,`order_channel` int(11) NOT NULL DEFAULT '1',`status` int(11) NOT NULL DEFAULT '0',`create_time` datetime NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `seckill_order` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`goods_id` bigint(20) NOT NULL,`order_id` bigint(20) NOT NULL,`create_time` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `uk_user_goods` (`user_id`,`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

实体类

用户实体类
@Entity
@Table(name = "user")
public class User implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String name;@Column(nullable = false)private String password;// getters and setters
}

 商品实体类

@Entity
@Table(name = "goods")
public class Goods implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String name;@Column(nullable = false)private BigDecimal price;@Column(nullable = false)private Integer stock;// getters and setters
}
秒杀商品实体类
@Entity
@Table(name = "seckill_goods")
public class SeckillGoods implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private Long goodsId;@Column(nullable = false)private BigDecimal seckillPrice;@Column(nullable = false)private Integer seckillStock;@Column(nullable = false)private Timestamp startTime;@Column(nullable = false)private Timestamp endTime;// getters and setters
}
秒杀订单实体类
@Entity
@Table(name = "seckill_order")
public class SeckillOrder implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private Long userId;@Column(nullable = false)private Long goodsId;@Column(nullable = false)private Long orderId;@Column(nullable = false)private Timestamp createTime;// getters and setters
}
订单实体类
@Entity
@Table(name = "order_info")
public class OrderInfo implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private Long userId;@Column(nullable = false)private Long goodsId;@Column(nullable = false)private String goodsName;@Column(nullable = false)private Integer goodsCount;@Column(nullable = false)private BigDecimal goodsPrice;@Column(nullable = false)private Integer orderChannel;@Column(nullable = false)private Integer status;@Column(nullable = false)private Timestamp createTime;// getters and setters
}

数据访问层接口

用户数据访问层接口
public interface UserRepository extends JpaRepository<User, Long> {User findByName(String name);
}
商品数据访问层接口
public interface GoodsRepository extends JpaRepository<Goods, Long> {
}
秒杀商品数据访问层接口
public interface SeckillGoodsRepository extends JpaRepository<SeckillGoods, Long> {SeckillGoods findByGoodsId(Long goodsId);
}
秒杀订单数据访问层接口
public interface SeckillOrderRepository extends JpaRepository<SeckillOrder, Long> {SeckillOrder findByUserIdAndGoodsId(Long userId, Long goodsId);
}
订单数据访问层接口
public interface OrderInfoRepository extends JpaRepository<OrderInfo, Long> {
}

服务实现

用户服务实现
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);}public User getUserByName(String userName) {return userRepository.findByName(userName);}public User registerUser(User user) {return userRepository.save(user);}// 其他用户相关业务逻辑
}
商品服务实现
@Service
public class GoodsService {@Autowiredprivate GoodsRepository goodsRepository;public Goods getGoodsById(Long goodsId) {return goodsRepository.findById(goodsId).orElse(null);}public List<Goods> getAllGoods() {return goodsRepository.findAll();}// 其他商品相关业务逻辑
}
秒杀商品服务实现
@Service
public class SeckillGoodsService {@Autowiredprivate SeckillGoodsRepository seckillGoodsRepository;public SeckillGoods getSeckillGoodsByGoodsId(Long goodsId) {return seckillGoodsRepository.findByGoodsId(goodsId);}public List<SeckillGoods> getAllSeckillGoods() {return seckillGoodsRepository.findAll();}// 其他秒杀商品相关业务逻辑
}
秒杀订单服务实现
@Service
public class SeckillOrderService {@Autowiredprivate SeckillOrderRepository seckillOrderRepository;public SeckillOrder getSeckillOrderByUserIdGoodsId(Long userId, Long goodsId) {return seckillOrderRepository.findByUserIdAndGoodsId(userId, goodsId);}public SeckillOrder createSeckillOrder(SeckillOrder seckillOrder) {return seckillOrderRepository.save(seckillOrder);}// 其他秒杀订单相关业务逻辑
}
订单服务实现
@Service
public class OrderInfoService {@Autowiredprivate OrderInfoRepository orderInfoRepository;public OrderInfo createOrderInfo(OrderInfo orderInfo) {return orderInfoRepository.save(orderInfo);}public OrderInfo getOrderInfoById(Long orderId) {return orderInfoRepository.findById(orderId).orElse(null);}// 其他订单相关业务逻辑
}
秒杀服务实现
@Service
public class SeckillService {@Autowiredprivate GoodsService goodsService;@Autowiredprivate SeckillGoodsService seckillGoodsService;@Autowiredprivate SeckillOrderService seckillOrderService;@Autowiredprivate OrderInfoService orderInfoService;@Autowiredprivate RabbitMQSender rabbitMQSender;@Autowiredprivate RedisService redisService;@Transactional(rollbackFor = Exception.class)public Result seckill(Long userId, Long goodsId) {// 查询商品信息Goods goods = goodsService.getGoodsById(goodsId);if (goods == null) {return Result.error("商品不存在");}// 查询秒杀商品信息SeckillGoods seckillGoods = seckillGoodsService.getSeckillGoodsByGoodsId(goodsId);if (seckillGoods == null) {return Result.error("秒杀商品不存在");}// 判断库存是否足够if (seckillGoods.getSeckillStock() <= 0) {return Result.error("库存不足");}// 检查用户是否已经秒杀过该商品SeckillOrder seckillOrder = seckillOrderService.getSeckillOrderByUserIdGoodsId(userId, goodsId);if (seckillOrder != null) {return Result.error("重复秒杀");}// 创建秒杀订单信息OrderInfo orderInfo = new OrderInfo();orderInfo.setUserId(userId);orderInfo.setGoodsId(goodsId);orderInfo.setGoodsName(goods.getName());orderInfo.setGoodsCount(1);orderInfo.setGoodsPrice(seckillGoods.getSeckillPrice());orderInfo.setOrderChannel(1);orderInfo.setStatus(0);orderInfo.setCreateTime(new Date());// 使用 RabbitMQ 异步创建订单rabbitMQSender.sendOrderInfo(orderInfo);return Result.success(orderInfo);}public Result getResult(Long userId, Long goodsId) {SeckillOrder seckillOrder = seckillOrderService.getSeckillOrderByUserIdGoodsId(userId, goodsId);if (seckillOrder != null) {return Result.success(seckillOrder);} else {return Result.error("未抢到");}}
}
Redis 服务实现
@Service
public class RedisService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public void cacheGoodsStock(List<Goods> goodsList) {if (goodsList == null) {return;}for (Goods goods : goodsList) {redisService.set("goodsStock:" + goods.getId(), String.valueOf(goods.getStock()));}}public Boolean decreaseStock(Long goodsId) {Long stock = Long.valueOf(stringRedisTemplate.opsForValue().get("goodsStock:" + goodsId));if (stock <= 0) {return false;}stock--;stringRedisTemplate.opsForValue().set("goodsStock:" + goodsId, String.valueOf(stock));return true;}
}
RabbitMQ 发送者实现
@Component
public class RabbitMQSender {@Autowiredprivate AmqpTemplate amqpTemplate;public void sendOrderInfo(OrderInfo orderInfo) {String msg = JSONObject.toJSONString(orderInfo);amqpTemplate.convertAndSend("seckillExchange", "seckill.key", msg);}
}

控制器实现

@RestController
@RequestMapping("/seckill")
public class SeckillController {@Autowiredprivate SeckillService seckillService;@PostMapping("/doSeckill")public Result doSeckill(Long userId, Long goodsId) {return seckillService.seckill(userId, goodsId);}@PostMapping("/getResult")public Result getResult(Long userId, Long goodsId) {return seckillService.getResult(userId, goodsId);}
}@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result registerUser(User user) {return Result.success(userService.registerUser(user));}@PostMapping("/login")public Result login(String name, String password) {User user = userService.getUserByName(name);if (user != null && user.getPassword().equals(password)) {return Result.success(user);} else {return Result.error("用户名或密码错误");}}
}@RestController
@RequestMapping("/goods")
public class GoodsController {@Autowiredprivate GoodsService goodsService;@GetMapping("/{goodsId}")public Result getGoodsById(@PathVariable Long goodsId) {return Result.success(goodsService.getGoodsById(goodsId));}@GetMapping("/all")public Result getAllGoods() {return Result.success(goodsService.getAllGoods());}
}@RestController
@RequestMapping("/seckillGoods")
public class SeckillGoodsController {@Autowiredprivate SeckillGoodsService seckillGoodsService;@GetMapping("/{goodsId}")public Result getSeckillGoodsByGoodsId(@PathVariable Long goodsId) {return Result.success(seckillGoodsService.getSeckillGoodsByGoodsId(goodsId));}@GetMapping("/all")public Result getAllSeckillGoods() {return Result.success(seckillGoodsService.getAllSeckillGoods());}
}

工具类

Result 工具类
public class Result {private Integer code;private String message;private Object data;public static Result success(Object data) {Result result = new Result();result.setCode(200);result.setMessage("success");result.setData(data);return result;}public static Result error(String message) {Result result = new Result();result.setCode(500);result.setMessage(message);result.setData(null);return result;}// getters and setters
}

应用启动类

@SpringBootApplication
@EnableTransactionManagement
@EnableJpaRepositories
public class SeckillApplication {public static void main(String[] args) {SpringApplication.run(SeckillApplication.class, args);}
}

以上代码示例是一个完整的秒杀功能实现,包含了用户、商品、秒杀商品、秒杀订单、订单等相关功能的实现。您可以根据实际需求进行调整和扩展。

http://www.xdnf.cn/news/902.html

相关文章:

  • jvm-获取方法签名的方法
  • 【uniapp-兼容性处理】安卓uView组件中u-input后置插槽不展示
  • 03-HTML常见元素
  • win10设置软件开机自启
  • 从0开始配置spark-local模式
  • 聊透多线程编程-线程互斥与同步-12. C# Monitor类实现线程互斥
  • Prompt 攻击与防范:大语言模型安全的新挑战
  • Google Store 如何利用 glTF 3D 模型改变产品教育
  • L1-1、Prompt 是什么?为什么它能“控制 AI”?
  • C++入门语法
  • 在线查看【免费】 mp3,wav,mp4,flv 等音视频格式文件文件格式网站
  • Spark,IDEA编写Maven项目
  • c++算法-(1)
  • Precision Machine Dynamics/Mechatronics Design - 5
  • 算法工程师面试题与参考答案资料(2025年版)
  • Python实例题:Pvthon3实现简单的FTP认证服
  • Pycharm(九)函数的闭包、装饰器
  • 【TeamFlow】4.1 Git使用指南
  • 高级java每日一道面试题-2025年4月19日-微服务篇[Nacos篇]-Nacos未来的发展方向和规划有哪些?
  • mac 本地 docker 部署 nacos
  • 本地搭建一个简易版本的 Web3 服务
  • 【Easylive】AdminFilter 详细解析
  • Sentinel源码—7.参数限流和注解的实现一
  • 经典算法 输出在环上的点
  • 【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人
  • 绿色体育直播赛事扁平自适应M25直播模板源码
  • Qt项目——汽车仪表盘
  • git详解
  • Vue v-for 循环DOM 指定dom个数展示一行
  • 【图像变换】pytorch-CycleGAN-and-pix2pix的学习笔记