2 Redis 事务 & 乐观锁
发布时间 - 2025-07-22 00:00:00 点击率:次redis事务的核心是将一组命令按顺序放入队列中,并批量执行。而关系型数据库的事务则是将事务操作(dml)记录到日志中。
与事务相关的命令包括:
-
Multi:开启事务 -
Exec:执行事务 -
Disca:终止事务
rd
注意,在执行Exec之前,事务操作可以使用Discard终止,但一旦执行Exec,本次事务就会执行。
如果在事务组队过程中出现错误(例如,正确的命令是set money 100,但你写成了sett money 100),那么本次事务的所有命令都不会执行。
Redis不保证原子性。在Exec执行过程中,如果某命令出错(比如数据库只允许存储数字,但你插入了字符),该错误命令不会执行,但其余正常命令仍然可以执行。
Redis如何实现事务?通过开启一个队列,让命令进入队列来执行事务。
# 1 开启事务 multi2 输入命令
set k1 v1 set k2 v2 get k2 set k2 v3 get k2
3 执行/放弃事务 (如果任何命令输错了,所有命令就不会执行,并且放弃事务!)
exec 或者 discard
Redis中的悲观锁效率低,所有悲观锁都不建议使用。悲观锁每次操作都会上锁,执行完毕后才释放锁,导致效率低下,降低并发量。
Redis使用CAS乐观锁,通过watch操作实现。乐观锁不进行锁定操作,但在实际执行时,如果发现key的版本发生了变化,本次修改的事务操作就不会执行。乐观锁提高了系统的吞吐量。
Redis乐观锁的使用场景如电影院购票:例如C1座位有多人同时抢购,这张票只能被一人抢成功。使用Redis乐观锁的好处是,在抢票时先锁定C1座位,等于被我预定,如果发现C1座位被别人抢走了,本次事务将不会执行。
# 先创建一个key money = 100 set money 100watch 就是乐观锁 注意 watch一定要在一个线程的事务之前!!!watch 需要锁Key名
线程1 操作:开启事务,并设置money为80 但不执行事务
multi set money 80 或者 decrby money 20
线程2 操作:读取money 设置money 为120
get money set money 120 或者 incrby money 20
线程1 执行事务
exec
一个线程 watch 并执行事务 失败时,一定要unwatch
unwatch
最后的结果是nil,说明乐观锁生效了。
原理分析:当一个事务在A线程执行操作时,如果发现相关内容被另一个B线程修改了,就会触发乐观锁,导致A事务操作不会执行。
特殊说明:解决问题的过程中,隐藏着调试Bug的痛苦。万物皆入轮回,谁也躲不掉!以上文章均为我实际操作后撰写的笔记资料,不会出现全文盗用他人文章的情况。请勿直接盗用!
# redis
# red
# 线程
# nil
# 并发
# 数据库
# bug
# 就会
# 过程中
# 但你
# 都不
# 相关内容
# 一人
# 则是
# 但在
# 均为
# 有多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网主机上快速搭建网站?
如何快速配置高效服务器建站软件?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
香港服务器如何优化才能显著提升网站加载速度?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel Fortify是什么,和Jetstream有什么关系
EditPlus中的正则表达式 实战(2)
javascript中的try catch异常捕获机制用法分析
网站建设要注意的标准 促进网站用户好感度!
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
青岛网站建设如何选择本地服务器?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
iOS验证手机号的正则表达式
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何在阿里云服务器自主搭建网站?
教你用AI将一段旋律扩展成一首完整的曲子
googleplay官方入口在哪里_Google Play官方商店快速入口指南
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何为不同团队 ID 动态生成多个独立按钮
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
简单实现jsp分页
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel怎么调用外部API_Laravel Http Client客户端使用
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何确保FTP站点访问权限与数据传输安全?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
制作旅游网站html,怎样注册旅游网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
JS实现鼠标移上去显示图片或微信二维码
lovemo网页版地址 lovemo官网手机登录
linux写shell需要注意的问题(必看)
如何确认建站备案号应放置的具体位置?
怎么用AI帮你设计一套个性化的手机App图标?
如何在橙子建站上传落地页?操作指南详解
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel如何创建自定义Facades?(详细步骤)
Laravel如何处理文件下载请求?(Response示例)


rd