Redis事务+秒杀案例

        Redis事务是一个单独的隔离操作,是指将多条命令放在一个命令队列当中,按顺序执行,保证多个命令在同一个事务中执行而不受其他客户端的影响。

        通俗来说就是:串联多个命令防止别的命令插队。

1.Multi、Exec、discard

        在输入Multi命令后,输入的命令都会依次进入命令队列中,这一过程也叫组队,直到输入Exec后,Redis会将命令队列中的命令依次执行。如下示例:

        而且在组队的过程中可以通过discard来退出输入,结束这个事务。如下示例:  

 

2.事务错误的处理

2.1组队的过程中报错

        如果组队的过程中添加命令时出现了错误,那么输入exec执行时队列中所有的命令都不会执行。  

2.2执行过程中报错

redis的事务中不会保证原子性,其中第二条命令有误,并不会影响命令1和命令3的执行。

3.Redis怎么解决事务冲突问题(watch)

        比如高并发下多个请求同时操作同一个账户,那么账户余额就可能出现问题,正常情况可以采用悲观锁或者乐观锁来解决。其中悲观锁实现就是给账户余额加锁,同一时间只能由一个事务来操作。乐观锁实现就是通过版本号来控制。但是乐观锁适用于读多写少的场景,而Redis就是利用乐观锁这种CAS机制来解决事务冲突问题的。

3.1对watch我的理解

        有客户端A和B,客户端A执行了watch key,就代表着A监视着此key,A会保存一份key的当前版本号,如果(无论什么地方)修改了此key的值,那么key的版本号就会发生变更。

        而判断比较key的版本号,这个环节只和事务有关系,只会在multi开启事务后,然后exec执行命令时才会生效。比如多个事务在输入multi命令之前,可以先执行watch key1 ....,用来监视一个或多个key,如果事务A在exec执行时发现事务A监视的key的版本已经被改动,那么这个事务A的命令队列就会被打断,命令全部不会执行,当操作被打断时,会返回空值nil

4.Redis事务的三大特性

  • 单独的隔离操作。

  • 没有隔离级别的概念。

  • 不保证原子性,出现错误继续向下执行。

5.秒杀案例

我们通过ab工具实现了并发模拟秒杀,结果出现了库存超卖和redis连接超时的问题。以下分析出现原因:

  • 超卖:在高并发请求下,多个请求同时开始查询到的是有库存的,然后就一窝蜂的去减库存,就会导致超卖。

  • 连接超时:因为redis是单线程操作内存,如果一瞬间请求过多,一直排在后面的请求就可能会产生连接超时。

5.1解决超卖问题

如果只需解决超卖问题其实也不难,我们可以使用watch来监视库存,从而使用乐观锁解决超卖的问题。

示例代码(qtkey表示的是库存的键,userkey表示存放用户id的key):

//增加乐观锁,监视库存
jedis.watch(qtkey);
//判断库存
String qtkeystr = jedis.get(qtkey);
if(qtkeystr==null || "".equals(qtkeystr.trim())) {System.out.println("未初始化库存");jedis.close();return false ;
}
int qt = Integer.parseInt(qtkeystr);
if(qt<=0) {System.err.println("已经秒光");jedis.close();return false;
}
//增加事务
Transaction multi = jedis.multi();
//减少库存
multi.decr(qtkey);
//添加用户信息
multi.sadd(usrkey, uid);
//执行事务
List<Object> list = multi.exec();
//判断事务提交是否失败
if(list==null || list.size()==0) {System.out.println("秒杀失败");jedis.close();return false;
}
System.err.println("秒杀成功");
jedis.close();

5.2解决连接超时的问题

        问题就是每个请求都要自己等待去建立和关闭连接,我们使用连接池来解决即可,连接池还能节省每次连接redis服务带来的消耗,能反复利用。

5.3库存遗留怎么解决

        我们使用乐观锁能够很好的解决超卖的问题,但是无法解决库存遗留的问题,比如库存余额为10,此时有50个请求同时过来,但是由于CAS导致很多的请求都失败了,导致先点的没抢到,后来的反而抢到了。虽然请求很多,但最终都可能导致还有库存遗留,这样就不太好。

        而且redis不支持悲观锁,所以用LUA脚本来解决。

        LUA是一个脚本语言,LUA脚本有一定的原子性不会被其他命令插队。我们将多步操作,写为一个脚本,一次性的交给redis执行。

        因为redis其单线程的特性,同一时间只能将一个LUA脚本彻彻底底的执行完后,才能执行下一个LUA脚本,所以LUA能同时解决超卖的问题和库存遗留的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据Doris(二十七):Routine Load数据导入演示

文章目录 Routine Load数据导入演示 一、启动kafka集群(三台节点都启动) 二、创建topic

[SWPUCTF 2021 新生赛]非常简单的逻辑题 // %的逆向

代码解密题 flag xxxxxxxxxxxxxxxxxxxxx s wesyvbniazxchjko1973652048$-&*<> result for i in range(len(flag)):s1 ord(flag[i])//17s2 ord(flag[i])%17result s[(s1i)%34]s[-(s2i1)%34] print(result) # result v0b9n1nkajzj0c4jjo3oi1h1i937b395i5y5e0e…

2024电脑录屏软件排行第一Camtasia喀秋莎

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

微信小程序面试题【100道】

文章目录 小程序面试题100问前言一、技术性问题1.有哪些参数传值的方法2.小程序修改数据值与Vue和React有什么差异3.如何实现下拉刷新与上拉加载4.bindtap和catchtap的区别是什么5.小程序有哪些导航API&#xff0c;它们各自的应用场景与差异区别是什么6.小程序中如何使用第三方…

城市易涝点怎么安装万宾科技内涝积水监测仪?

城市内涝是多个城市广泛存在的问题&#xff0c;经常给城市的居民和基础设施带来一些安全威胁。暴雨引发的道路积水和交通中断、财产损失&#xff0c;甚至公共安全威胁都是城市管理者需要提前预防的问题。为了解决这些问题&#xff0c;内涝积水监测仪的应用是一大重要的举措&…

CSDN流量卷领取和使用保姆级教程——流量卷,恭喜获得每日任务奖励【1500曝光】可获得新增曝光,阅读转化,点赞转化,新增关注-流量卷,流量卷,流量卷

希望本文能够给您带来一定的帮助&#xff0c;文章粗浅&#xff0c;敬请批评指正&#xff01; 目录 话不多说&#xff0c;直接上干货&#xff1a; 第一步&#xff1a;流量卷领取教程&#xff1a;点击内容管理&#xff1a;​编辑 第二步&#xff1a;点击首页&#xff1a;​编辑…

springcloud医院挂号预约系统源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;nodejs&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示医生列表&#xff0c;医院简介&#xff0c;点击医生…

2023年【上海市安全员C3证】考试内容及上海市安全员C3证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员C3证考试内容是安全生产模拟考试一点通总题库中生成的一套上海市安全员C3证复审考试&#xff0c;安全生产模拟考试一点通上上海市安全员C3证作业手机同步练习。2023年【上海市安全员C3证】考试内容及上海…

在银行外包如何自我提升

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…

阿里云ECS服务器如何搭建并连接FTP,完整步骤

怎么用终端连接服务器就不多说了&#xff0c;直接开始搭建FTP。 我是用root账号执行的命令&#xff0c;如果不使用root账号&#xff0c;注意在命令前面加sudo。 一、安装FTP 我这里安装的是vsftpd。 1、检查是否已安装vsftpd&#xff1a; vsftpd -v如果出现了版本信息&…

智能座舱架构与芯片- (5) 硬件篇 下

四、短距无线连接 随着汽车智能化的发展与新型电子电气架构的演进&#xff0c;传统车内有线通信技术存在着诸多痛点&#xff1a; 线束长度增加&#xff1a;由于智能化与自动化的发展&#xff0c;车内传感器和执行器均大幅增加。采用有线技术连接&#xff0c;则线束长度&#…

FL Studio21.2.0.3858免激活版安装下载

前阵子世界级电音盛会Tomorrowland在比利时如期举行&#xff0c;拉开了疫情下Rave文化复兴的帷幕。而国内&#xff0c;也推出了如《超感星电音》等电子音乐综艺&#xff0c;在节目上大家也更多地了解到了电子音乐的制作过程。节目中最被大家看好的制作人Carta所使用的FL Studio…

Camtasia2024年破解版安装包如何下载?

作为一个互联网人&#xff0c;没少在录屏软件这个坑里摸爬滚打。培训、学习、游戏、影视解说……都得用它。这时候没个拿得出手的私藏软件&#xff0c;还怎么混&#xff1f;说实话&#xff0c;录屏软件这两年也用了不少&#xff0c;基本功能是有但总觉得缺点什么&#xff0c;直…

SpringBoot静态资源配置

项目中 SSM中配置 第一种&#xff1a;配置文件中 <mvc:resources mapping"/js/**" location"/js/"/> <mvc:resources mapping"/css/**" location"/css/"/> <mvc:resources mapping"/html/**" location&q…

在无回显的情况下如何判断是否存在命令注入漏洞

在无回显的情况下如何判断是否存在命令注入漏洞 这种情况下可以使用OOB带外来实现&#xff0c;言而简之&#xff0c;就是利用命令执行漏洞去解析我们的dns如果dns日志有记录那就说明存在命令注入漏洞 首先先简单搭建一个无回显的命令注入 <?phpexec($_REQUEST[777]); ?&…

windows事件查看器日志

Windows 事件查看器&#xff08;Event Viewer&#xff09;是 Windows 操作系统提供的一个内置工具&#xff0c;它用于管理和查看系统、应用程序和安全事件日志。在 Windows 系统中&#xff0c;各种活动和错误都会被记录到事件日志中&#xff0c;包括系统启动、应用程序崩溃、安…

力扣第463题 岛屿的周长 C++ 深度优先搜索 + 思维判断的边界

题目 463. 岛屿的周长 简单 相关标签 深度优先搜索 广度优先搜索 数组 矩阵 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线…

Gem5系统仿真模拟器之创建gem5——翻译自官网

文章目录 安装并使用gem5 模拟器支持的操作系统和环境依赖在 Ubuntu 22.04 启动(gem5 > v21.1)Docker获取代码用 SCons 构建用法首次构建 gem5gem5 二进制类型调试opt快速 常见错误错误的 gcc 版本Python 位于非默认位置未安装 M4 宏处理器Protobuf 3.12.3 问题 安装并使用g…

OpenAI宫斗大戏,奥特曼面临的选择

首先不得不说&#xff0c;这件事情进展真快&#xff0c;三四天时间之内&#xff0c;大量的消息&#xff0c;各种不同渠道的&#xff0c;各种不同角度的&#xff0c;其中也包括各种决策&#xff0c;速度之快真的是应接不暇&#xff0c;仿佛在看真人秀一般 这里简单帮大家梳理一…

2021秋招-面经

面经总结 微软STCA面试-面经 字节AI lab实习面试记录 腾讯PCG-腾讯新闻面试 百度(AIDU)-内容策略部门面试 百度(AIDU)-搜索策略-机器学习算法工程师 百度(AIDU)-知识图谱部门算法工程师(2020-07-08) 百度(AIDU)-NLP部门算法工程师(2020-07-10) 微软STCA面试-面经 2020-…