利用redis实现分布式事务锁,解决高并发环境下库存扣减
问题描述:
某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖
解决方案一
利用数据库锁机制,对记录进行锁定,再进行操作
select * from goods where id =1 for update ;
update goods set count = count - 1 where id= 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实现分布式事务锁,解决高并发环境下减库存
原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...
- MQ在高并发环境下,如果队列满了,如何防止消息丢失?
1.为什么MQ能解决高并发环境下的消息堆积问题? MQ消息如果堆积,消费者不会立马消费所有的消息,不具有实时性,所以可以解决高并发的问题. 性能比较好的消息中间件:Kafka.RabbitMQ,Roc ...
- 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!
写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...
- 【高并发】高并发环境下如何优化Tomcat配置?看完我懂了!
写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行模式 Tomca ...
- PHP利用Mysql锁解决高并发
前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用Mysql的锁来解决高并发的问题 先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ...
- 使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法
数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 利用Redis锁解决高并发问题
这里我们主要利用Redis的setnx的命令来处理高并发. setnx 有两个参数.第一个参数表示键.第二个参数表示值.如果当前键不存在,那么会插入当前键,将第二个参数做为值.返回 1.如果当前键存在 ...
- 利用 Redis 锁解决高并发问题
这里我们主要利用 Redis 的 setnx 的命令来处理高并发. setnx 有两个参数.第一个参数表示键.第二个参数表示值.如果当前键不存在,那么会插入当前键,将第二个参数做为值.返回 1.如果当 ...
随机推荐
- Python_算术运算符
1.算术运算符 示例: >>> num1=7 >>> num2=3 >>> num1+num2 #+ 10 >>> num1-n ...
- 三维视觉、SLAM方向全球顶尖实验室汇总
本文作者 任旭倩,公众号:计算机视觉life,编辑成员 欧洲 英国伦敦大学帝国理工学院 Dyson 机器人实验室 http://www.imperial.ac.uk/dyson-robotics-la ...
- Codeforces #503 C. Elections(贪心,逆向
我的参考的博客地址 题目 逆向考虑. 暴力遍历 k(k是1到n/2+1 范围内的),挑出对于每一个k,记对于党派 i,num[ i ]为其票数.num[ i ]小于k-1的就不用改变投票了(这部分是比 ...
- 个性化召回算法实践(三)——PersonalRank算法
将用户行为表示为二分图模型.假设给用户\(u\)进行个性化推荐,要计算所有节点相对于用户\(u\)的相关度,则PersonalRank从用户\(u\)对应的节点开始游走,每到一个节点都以\(1-d\) ...
- 0020SpringBoot使用SpringCloud中的eureka实现远程调用
要实现远程调用,主要需要三个module:一个注册中心.一个服务提供者.一个服务消费者,然后进行各自的配置和编码,详细内容如下: 1.建一个空的project,创建3各module a.注册中心模块 ...
- 多继承以及MRO顺序
class A: def test(self): print("A --- test方法") def demo(self): print("A --- demo方法&qu ...
- [GraphQL] Set variable and default value & alias
query($category:PetCategory=CAT, $status:PetStatus=AVAILABLE) { #availablePets is the alias availabl ...
- git 廖雪峰博客笔记
其他参考 http://www.softwhy.com/article-8498-1.html 本地模拟多用户来学习 参考 其实就是克隆两个目录,两个目录的git config 不同的名字和邮箱, ...
- bzoj 3721: PA2014 Final Bazarek 贪心
如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: #include <bits/stdc++.h> ...
- js2py
js2py