抽象类适合定义秒杀库存校验与扣减的通用流程骨架,固化幂等校验、状态检查、事务边界等不变逻辑,将库存来源、扣减方式等变化点交由子类实现;通过final模板方法控制执行顺序,强制子类实现getstock、trydeductstock等核心能力,并内置分布式信号量、本地缓存兜底、统一异常分类与结构化日志。

在高并发秒杀系统中,抽象类适合定义库存校验与扣减的通用流程骨架,把不变逻辑(如幂等校验、状态检查、事务边界)固化,把变化点(如库存来源、扣减方式、缓存策略)留给子类实现。
统一定义模板方法:封装标准执行流程
抽象类通过 final 模板方法 控制整体执行顺序,确保关键步骤不被跳过或错序:
- 先做请求幂等性校验(如基于用户+商品ID的分布式锁或Redis SETNX)
- 再查当前可用库存(支持从 Redis 缓存或 DB 读取,由子类决定)
- 接着执行业务规则校验(如限购数、活动时间、用户资格等)
- 然后原子化扣减库存(子类实现具体扣减逻辑,如 Lua 脚本、CAS 更新、或数据库行锁)
- 最后触发后续动作(如生成订单、发 MQ、更新缓存),可设为钩子方法(hook)供子类扩展
声明抽象能力契约:明确子类必须实现的核心行为
抽象类中定义以下抽象方法,强制子类提供高并发场景下的关键能力:
- getStock(String skuId):获取实时库存值,子类可对接 Redis(incr/get)、分库分表 DB 或本地 Caffeine + 分布式刷新
- tryDeductStock(String skuId, int quantity):尝试扣减,返回 boolean 表示是否成功;要求具备原子性,例如用 Redis EVAL 执行 Lua,或 MySQL UPDATE ... WHERE stock >= #{quantity}
- rollbackStock(String skuId, int quantity):失败时回滚(如超时/异常),用于补偿或重试场景
- isStockSufficient(int available, int required):自定义库存充足判断逻辑(比如支持虚拟库存、预售、阶梯库存等)
内置线程安全与降级支持
抽象类可预置并发防护和容错机制,避免每个子类重复造轮子:
- 集成 分布式信号量(如 Redisson Semaphore)控制单商品并发扣减上限,防止瞬间打满 DB 连接
- 提供 本地缓存兜底:当 Redis 不可用时,自动降级走本地 LoadingCache(带定时刷新),保证基本可用
- 封装 统一异常分类:如 StockNotEnoughException、StockConcurrentException、StockDeductTimeoutException,便于上层统一处理和监控告警
- 记录结构化日志(traceId + skuId + before/after stock),方便链路追踪和问题定位
子类只需专注领域细节,不碰流程编排
例如实现一个「Redis+Lua」版秒杀库存处理器:
- 继承抽象基类,只实现
getStock(调用 Redis GET)、tryDeductStock(执行预加载的 Lua 脚本) - 复用父类的幂等校验(基于 Redis SETEX)、超时控制(带 timeout 的 tryLock)、以及失败后的异步补偿(发 MQ 回滚消息)
- 无需关心“什么时候查库存”“要不要加锁”“失败怎么通知”,这些都由抽象类保障
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











