利用redis实现分布式事务锁,并解决高并发环境下库存扣减
2019-03-01 18:11
344 查看
问题描述:
某电商平台,首发一款新品手机,每人限购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); } //coding here 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"); }
相关文章推荐
- 利用redis实现分布式事务锁,解决高并发环境下库存扣减
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
- 利用redis实现分布式环境下的限频
- 利用Memcache解决分布式环境下的高并发秒杀活动
- Java并发 利用多写Redis实现分布式锁原理
- 利用redis分布式锁的功能来实现定时器的分布式
- 分布式秒杀系统-REDIS(高并发、高性能、库存数据一致、非阻塞拒绝模式、不限语言-设计思路一致)
- 使用redis实现分布式锁,可以解决集群中需要单例的情况
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- 分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket
- 高并发分布式事务解决之道-Actor模型(附Akka与Reactor比较)
- java 解决分布式环境中 高并发环境下数据插入重复问题
- 分布式锁解决并发的三种实现方式
- 基于redis实现的扣减库存
- 关于利用MQ实现分布式事务的想法【转】
- spring.net 分布式事务 实现方式 多数据库并发访问下 服务层 事务管理 .net下事务管理
- 如何利用jgroups实现分布式环境下消息的接受和发送
- 利用多写Redis实现分布式锁原理与实现分析
- 分布式环境下,事务在客户端远程调用中事务不能传播的问题的解决