JAVA语言企业项目实战(二)

简介: 教程来源 http://oplhc.cn/category/hardware-review.html 本节详解秒杀系统数据库设计:强调读写分离、热点隔离、冗余字段与索引优化;详述用户、秒杀商品、订单及记录四张核心表结构,含BCrypt加密、乐观锁、唯一约束等关键设计;并给出HikariCP连接池合理配置策略。

第二部分:数据库设计:地基决定上层建筑

2.1 为什么数据库设计如此重要?
在秒杀系统中,数据库设计直接影响系统的性能和可扩展性。糟糕的数据库设计会导致SQL执行缓慢、锁竞争严重、数据不一致等问题。

秒杀系统的数据库设计原则:
读写分离:秒杀活动时,读操作远多于写操作。可以通过主从复制实现读写分离。
热点隔离:秒杀商品表与普通商品表分开,避免热点数据影响其他业务。
冗余设计:订单表中冗余商品名称和价格,避免关联查询。
索引优化:为查询条件字段建立索引,避免全表扫描。

2.2 核心表结构详解
用户表(user)
用户表存储所有注册用户的信息。密码使用BCrypt加密存储,这是一种自适应哈希算法,即使数据库泄露,也很难还原出原始密码。

CREATE TABLE `user` (
    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    `username` VARCHAR(50) NOT NULL COMMENT '用户名(唯一)',
    `password` VARCHAR(255) NOT NULL COMMENT '密码(BCrypt加密)',
    `salt` VARCHAR(50) NOT NULL COMMENT '密码盐值',
    `phone` VARCHAR(20) COMMENT '手机号(唯一)',
    `email` VARCHAR(100) COMMENT '邮箱(唯一)',
    `last_login_ip` VARCHAR(45) COMMENT '最后登录IP',
    `last_login_time` DATETIME COMMENT '最后登录时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_username` (`username`),
    UNIQUE KEY `uk_phone` (`phone`),
    UNIQUE KEY `uk_email` (`email`)
);

秒杀商品表(seckill_goods)
这是最核心的表,存储秒杀商品的信息。注意几个关键字段:

stock_count:库存数量,秒杀时会被频繁更新,是锁竞争的核心。

version:乐观锁版本号,用于无锁编程,避免行锁导致的性能下降。

start_time和end_time:秒杀时间段,需要建立索引以便快速过滤。

CREATE TABLE `seckill_goods` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `goods_name` VARCHAR(200) NOT NULL COMMENT '商品名称',
    `price` DECIMAL(10,2) NOT NULL COMMENT '原价',
    `seckill_price` DECIMAL(10,2) NOT NULL COMMENT '秒杀价(通常会便宜很多)',
    `stock_count` INT NOT NULL COMMENT '库存数量',
    `start_time` DATETIME NOT NULL COMMENT '秒杀开始时间',
    `end_time` DATETIME NOT NULL COMMENT '秒杀结束时间',
    `version` INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
    PRIMARY KEY (`id`),
    KEY `idx_start_end_time` (`start_time`, `end_time`)
);

秒杀订单表(seckill_order)
订单表记录了每个成功秒杀的用户和商品。注意几个设计细节:

order_no:订单号,使用唯一索引防止重复创建。

goods_price:冗余了商品价格,避免因商品价格变化影响历史订单。

order_status:订单状态,支持后续的支付、发货等流程。

CREATE TABLE `seckill_order` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `order_no` VARCHAR(32) NOT NULL COMMENT '订单号(唯一)',
    `user_id` BIGINT NOT NULL,
    `goods_id` BIGINT NOT NULL,
    `goods_name` VARCHAR(200) NOT NULL,
    `goods_price` DECIMAL(10,2) NOT NULL,
    `quantity` INT NOT NULL DEFAULT 1,
    `total_amount` DECIMAL(10,2) NOT NULL,
    `order_status` TINYINT NOT NULL DEFAULT 0 COMMENT '0待支付 1已支付',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_order_no` (`order_no`),
    KEY `idx_user_id` (`user_id`),
    KEY `idx_goods_id` (`goods_id`)
);

秒杀记录表(seckill_record)
这是防重复秒杀的关键。通过uk_user_goods唯一索引,确保同一个用户对同一个商品只能秒杀一次。

CREATE TABLE `seckill_record` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `user_id` BIGINT NOT NULL,
    `goods_id` BIGINT NOT NULL,
    `order_id` BIGINT COMMENT '订单ID(成功时才有)',
    `state` TINYINT NOT NULL DEFAULT 0 COMMENT '0处理中 1成功 2失败',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_user_goods` (`user_id`, `goods_id`)
);

2.3 数据库连接池配置:别让连接成为瓶颈
数据库连接池是应用程序与数据库之间的桥梁。每次创建数据库连接都是一次TCP握手,开销很大。连接池通过复用连接,大大减少了这种开销。

spring:
  datasource:
    hikari:
      # 最大连接数:根据数据库服务器配置和应用需求确定
      # 公式:连接数 = (核心数 * 2) + 磁盘数
      # 单机MySQL通常建议20-50
      maximum-pool-size: 20

      # 最小空闲连接:连接池保持的最小连接数
      # 设置太小会导致突发流量时创建连接,增加延迟
      minimum-idle: 5

      # 连接超时:获取连接的最大等待时间
      # 设置太短会导致获取连接失败,太长会影响用户体验
      connection-timeout: 30000

      # 空闲超时:连接空闲多久后被回收
      idle-timeout: 600000

      # 最大生命周期:连接的最大存活时间
      # 应该小于数据库的wait_timeout
      max-lifetime: 1800000

      # 连接测试查询:验证连接是否有效
      connection-test-query: SELECT 1

为什么这些配置很重要?

maximum-pool-size过大:数据库连接数过多,会消耗数据库资源,导致性能下降。

maximum-pool-size过小:高并发时获取不到连接,请求排队或失败。

connection-timeout过大:线程长时间等待,拖垮整个系统。

max-lifetime过大:连接长时间不释放,可能被数据库端主动断开。
来源:
http://oplhc.cn/category/artificial-intelligence.html

相关文章
|
1月前
|
人工智能 Prometheus 监控
Python+AI实战:从零构建智能图像识别系统(三)
教程来源 https://yyvgt.cn/category/jiuwenhua.html 本文构建了完整的智能商品分类系统,涵盖数据处理、EfficientNet模型训练(支持AMP、EMA、早停)、ONNX/TensorRT优化、FastAPI部署、Celery异步任务、Prometheus监控、A/B测试及主动学习等全链路AI工程实践。
|
1月前
|
消息中间件 NoSQL Java
JAVA语言企业项目实战(三)
教程来源 http://oplhc.cn/category/tech-trends.html 本文详解秒杀系统核心实现:对比数据库乐观锁、Redis预减库存+异步下单、分布式锁+Lua脚本三种方案,涵盖高并发选型与一致性权衡;统一响应格式、全局异常处理保障健壮性;结合消息队列削峰填谷,确保高性能与数据最终一致。
|
1月前
|
消息中间件 缓存 NoSQL
JAVA语言企业项目实战(一)
教程来源 http://oplhc.cn/ 本文深入剖析电商秒杀系统的设计与实现,直击高并发、数据一致性、系统稳定性等Java企业级开发核心挑战。涵盖单体→缓存→异步→微服务四阶段架构演进,详解库存防超卖、热点优化、限流降级等关键技术,助你打造高性能、高可用的实战级系统。
|
1月前
|
缓存 NoSQL Java
JAVA语言企业项目实战(四)
教程来源 http://oplhc.cn/category/artificial-intelligence.html 本节详解秒杀系统缓存优化:通过Redis预热热点数据降低数据库压力;针对缓存穿透(空值缓存)、击穿(分布式锁+双重检查)、雪崩(随机过期时间)三大问题,提供可落地的解决方案,全面提升系统并发性能与稳定性。
|
1月前
|
NoSQL Java Redis
JAVA语言企业项目实战(六)
教程来源 http://qcycj.cn/category/jiujieshao.html 本文详解秒杀系统部署与运维实践:涵盖Docker容器化、Docker Compose一键编排、Prometheus监控告警;总结核心思想——流量控制、缓存为王、最终一致性;解析超卖防护、高可用保障等面试要点,并探讨架构演进的务实原则。
|
1月前
|
消息中间件 运维 监控
海尔智家 x 阿里云 Kafka 实践:轻松支撑百亿级消息,稳定性与效率双提升
海尔智家通过与阿里云深度共创,采用定制化迁移与调优方案,平滑升级至Kafka Serverless,不仅保障了极致稳定性,更实现运维自动化,大幅释放研发人力。
179 25
|
1月前
|
缓存 安全 算法
深入拆解 Java CAS:从底层原理到 ABA 问题实战
本文深入解析Java中CAS(比较并交换)的底层原理:从CPU指令级支持(cmpxchg、缓存锁/总线锁)、Unsafe类的核心作用,到ABA问题的成因及AtomicStampedReference等解决方案,全面剖析无锁并发机制的优劣与实践要点。
172 10
|
1月前
|
存储 运维 监控
智算中心建设项目一般过程解析
智算中心是支撑AI、大数据发展的新型算力基础设施。九章云极主导建设运营,覆盖立项、设计、部署等六阶段全流程,3年内目标纳管10万P算力。(239字)
|
1月前
|
缓存 Java 数据库
Java进阶之路:从初级开发到高级工程师的能力提升指南
很多Java初学者在掌握了基础语法和核心特性后,都会陷入一个困惑:如何从初级开发工程师,逐步成长为高级Java开发工程师?
188 1
|
2月前
|
消息中间件 弹性计算 监控
在阿里云上搭建低延迟行情监控系统(WebSocket实战)
本文详解如何在阿里云ECS(Ubuntu 22.04)上用Python构建生产级WebSocket行情客户端:支持自动重连、心跳保活、多市场(股票/加密货币)实时订阅,并通过消息队列解耦处理,显著提升稳定性与低延迟。