高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
来源:互联网 发布:淘宝达人怎么发帖子 编辑:程序博客网 时间:2024/06/06 06:32
高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
问题描述:某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖
方案一
利用数据库锁机制,对记录进行锁定,再进行操作
SELECT * from goods where ID =1 for update;UPDATE goods set stock = stock - 1;
方案二
利用redis 实现分布式锁,
使用setnx命令(在key不存在时,创建并设置value 返回1,key存在时,会反回0)来获取锁,在业务逻辑中,我们可以通过这样的方案来操作
Jedis client = jedisPool.getResource(); while(client.setnx("lock",String.valueOf(System.currentTimeMillis())) == 0){ Thread.sleep(10000); } ........................... client.del("lock")
方案二进阶
考虑到死锁问题,即现成A获取锁后,宕机了,导致锁一直无法释放,我们可以通过get命令获取锁的时间戳,通过他进行超时判断,并进行释放
Long TIMEOUT_SECOUND = 120000L; Jedis client = jedisPool.getResource(); while(client.setnx("lock",String.valueOf(System.currentTimeMillis())) == 0){ Long lockTime = Long.valueOf(client.get("lock")); if (lockTime!=null && System.currentTimeMillis() > lockTime+TIMEOUT_SECOUND) { client.del("lock"); } Thread.sleep(10000); } ........................... ........................... client.del("lock")
方案二加强
方案2的算法中,为了确保在非超时情况下,锁只能由有锁的线程进行释放,可以在value的时间戳中,拼上线程特征码
Long TIMEOUT_SECOUND = 120000L; String featureCode = "machine01"; Jedis client = jedisPool.getResource(); while(client.setnx("lock",featureCode+":"+String.valueOf(System.currentTimeMillis())) == 0){ Long lockTime = Long.valueOf(client.get("lock").substring(9)); if (lockTime!=null && System.currentTimeMillis() > lockTime+TIMEOUT_SECOUND) { client.del("lock"); } Thread.sleep(10000); } ........................... ........................... if (featureCode.equals(client.get("lock").substring(0, 8))) { client.del("lock"); }
0 0
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
- 分布式事务,高并发下分布式事务的解决方案
- 高并发库存控制
- 高并发库存控制
- 高并发库存控制
- 高并发扣库存
- 高并发、分布式交易场景下唯一ID生成方法
- 高并发下减库存操作避免超卖
- 利用mysql事务隔离级别解决php高并发问题
- 使用Redis实现高并发分布式序列号生成服务
- 使用Redis实现高并发分布式序列号生成服务
- 使用Redis实现高并发分布式序列号生成服务
- 使用Redis实现高并发分布式序列号生成服务
- 利用redis + lua解决抢红包高并发的问题
- 利用redis + lua解决抢红包高并发的问题
- 利用redis + lua解决抢红包高并发的问题
- 利用redis + lua解决抢红包高并发的问题
- 利用redis + lua解决抢红包高并发的问题
- 多线程编程(二)--进程&&线程
- JS 日期对象
- 数据库连接池C3P0学习
- 通俗易懂谈上拉电阻与下拉电阻
- hdu1348 Wall(凸包模板题)
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
- PCA与KPCA
- Arcgis4js实现链家找房的效果
- Hibernate入门(五)hibernate的级联(cascade)表操作
- 阿里云服务器部署mysql、tomcat、jdk
- spring的AOP简介与事务传播特性总结(转载)
- 线段树模板1
- R3抹掉加载的DLL
- CentOS7下安装tomcat及操作