redis--008

一、秒杀下单基础流程

  1. 接收优惠券 id
  2. 查询优惠券信息
  3. 校验:秒杀时间是否合法(未开始 / 已结束直接返回失败)
  4. 判断库存是否充足,库存不足直接返回失败
  5. 扣减库存
  6. 创建优惠券订单,返回订单 ID

问题:查询库存、扣减库存分为两步操作,高并发多线程场景下出现超卖,属于线程安全问题

二、悲观锁 vs 乐观锁

表格

悲观锁 乐观锁
核心思想 认定并发冲突一定会发生,操作数据前先上锁,线程串行执行 认定冲突不一定发生,不加锁,更新的时候检测是否被别人修改过
实现例子 synchronized、Lock、数据库行锁 版本号法、CAS 法
优点 逻辑简单,保证一定成功 并发性能好,没有锁阻塞
缺点 并发串行,性能较差 高并发场景更新成功率低,可能需要重试

1. 悲观锁

提前获取锁,同一时刻只允许一个线程操作库存,其他线程阻塞等待。 适合写冲突频繁的业务。

2. 乐观锁

不上锁,执行更新时校验数据是否被其他线程改动;如果已经被修改,则更新失败,可以选择重试或者返回报错。 两种实现方式:

  1. 版本号法 数据表增加version版本字段。
  • 查询:同时读出库存 + version
  • 更新:update ... set stock=stock‑1,version=version+1 where id=? and version=旧版本号
  • 如果 where 条件不匹配,说明别的线程已经修改过这条数据,本次扣减失败。
  1. CAS 法(基于库存本身做校验) 不需要额外增加 version 字段,直接拿查询出来的库存值作为条件。
  • 查询得到 stock
  • 更新:update ... set stock = stock‑1 where id=? and stock=查询出来的旧库存
  • 如果条件不命中,代表库存已经被其他线程修改,扣减失败。

CAS 缺点:ABA 问题;版本号法可以规避 ABA。

相关推荐
IvorySQL几秒前
PostgreSQL 日报|8 字节 TOAST 值支持(9 月 16 日)
数据库·人工智能·postgresql
金玉满堂@bj7 分钟前
多环境部署方案(开发、测试、生产,搭配Tomcat\+WAR包)
java·tomcat·maven
白远山15 分钟前
无人自助健身平台搭建:从架构设计到设备联动的完整实战
java·开发语言·架构·需求分析
古法安卓24 分钟前
Android-Fork 机制详解
android·java·android studio
实验室管理云平台27 分钟前
北京盛元广通推疾控中心实验室管理系统,提升检测效率
数据库·python
曹牧29 分钟前
Spring:HttpMessageConverter
java
许彰午32 分钟前
47-MetaGrid元数据表格
java·低代码·架构
wang_shu_mo_ran35 分钟前
Spring MVC的常用注解和用法(一)
java·spring·mvc
晴空蓝天43 分钟前
Spring Boot 3.5 脚手架里的 JWT + Redis 双轨会话,双端 token 隔离我是这么设计的
java·spring boot·redis
IT枫斗者枫哥1 小时前
MyBatis 列表查询优化:一页20条数据,21次SQL改成2次
java