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

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);}
}

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

相关文章:

  • 丝杆升降机蜗轮蜗杆加工工艺深度解析:从选材到制造的全流程技术要点​
  • 软件工程中的维护类型
  • 模型的RAG
  • 运营商二要素认证API接口有哪些发展前景?
  • 基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention
  • 【项目日记(三)】
  • pytest-项目结构
  • 明心见性与真如三昧
  • 为什么RPN经过的候选框处理后,要使用rcnn来进行候选框的分类和回归操作?
  • Android audio_policy_configuration.xml加载流程
  • 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真
  • VLAN间通讯技术
  • 关于QTableWidget控件中不显示Item的问题解决方法
  • MCP是什么?
  • windows搭建wireshark抓包snmp协议环境步骤
  • 3.THREE.FogExp2 全面详解 + 实例演示 + 深度解析
  • 【Redis】SpringDataRedis
  • 【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)
  • 悬空引用和之道、之禅-《分析模式》漫谈57
  • 异或区间的划分
  • 特朗普亲自介入美日关税谈判:以势压人还是给对手“送助攻”
  • 女子伸腿阻止高铁关门被拘,央媒:严格依规公开处理以儆效尤
  • 大理州工业投资(集团)有限公司党委副书记、副总经理赵云接受审查调查
  • 不降息就走人?特朗普试图开先例罢免美联储主席,有无胜算
  • 擘画开放新篇 共筑合作之桥——中国银行上海市分行全力护航第八届进博会筹备工作
  • 赓续赣鄱千年文脉,江西省谱写文旅发展新篇