场景需求
在秒杀活动或者是11.11或者6.18场景中,对于某个商品在某个时间段,瞬间出现大量的的购买订单,导致库存读取不正确,销售量超过了实际的库存,但是超卖了
- 商品秒杀活动
- 11.11或者6.18
场景分析
todo
解决方案
锁
适用架构: 单体架构
锁也是在单体架构中也是一个选择
- synchronize
- Lock
- …
锁的实现有很多其他的方式,但是原理大概都是相同的。
优缺点
优点 | 缺点 |
---|---|
不依赖第三方,比较简单 | 不适用分布式架构,而且比较重,性能消耗比较大 |
Redis + Lua
适用架构:单体+分布式
Redis
原理:redis本身支持多线程,操作是队列有序的
分析
setNx语句支持,Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
Redis + Lua
原理
- 将在java中的非原子操作放在redis支持的原子操作脚本Lua中执行
- redis操作的单线程性,操作脚本是队列操作
分析(伪代码)
java代码
redis + lua代码
Redission
适用结构: 分布式结构(单体结构也适用,但是会牺牲部分的性能)
Redission是Alibaba开源的一个分布式锁,同时它基于redis,其实它的实现原理也是使用redis+lua