控制库存的选定的五个技术方案
- mysql乐观锁
- mysql悲观锁
- redis的原子操作incr
- redis的watch(redis乐观锁)
- redis执行lua脚本
测试结果(8核16G,300个线程并发,每次消耗一个库存,时间单位ms)
方案对比
推荐使用redis+LUA的方式实现。
- mysql乐观锁,在高并发的情况下会导致大量的无效请求,同时对mysql数据库的性能造成影响,导致系统吞吐的急剧下降。
- mysql悲观锁,在高并发下虽然执行的总体耗时不会太长,但是会导致用户长时间等待,并且不释放数据库的连接,导致其他业务拿不到数据库连接。
- redis的watch跟mysql的乐观锁有同样的问题,会导致大量无效的请求,进而导致正常请求无法完成。
- redis的原子操作,incr在压测看起来是效果最好的。但是因为是先减库存然后不过库存不足的时候再回滚当前操作,所以会造成库存抖动,用户体验会不太好。incr和lua的实现原理大致是相同的,会比lua快是因为它只执行单一的incr操作,判断在client端,并且client端是多线程去执行的,但是redis是单线程执行。
- redis+LUA,这个是最理想的状态。