2 Redis 事务 & 乐观锁

发布时间 - 2025-07-22 00:00:00    点击率:

redis事务的核心是将一组命令按顺序放入队列中,并批量执行。而关系型数据库的事务则是将事务操作(dml)记录到日志中。

与事务相关的命令包括:

  • Multi:开启事务
  • Exec:执行事务
  • Discard:终止事务

注意,在执行Exec之前,事务操作可以使用Discard终止,但一旦执行Exec,本次事务就会执行。

如果在事务组队过程中出现错误(例如,正确的命令是set money 100,但你写成了sett money 100),那么本次事务的所有命令都不会执行。

Redis不保证原子性。在Exec执行过程中,如果某命令出错(比如数据库只允许存储数字,但你插入了字符),该错误命令不会执行,但其余正常命令仍然可以执行。

Redis如何实现事务?通过开启一个队列,让命令进入队列来执行事务。

# 1 开启事务
multi

2 输入命令

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 100

watch 就是乐观锁 注意 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示例)