当前位置: 首页 > news >正文

Redis中事务与乐观锁

1. Redis中的事务

Redis中的事务类似于关系型数据库中的事务,但其功能相对较轻量。事务通过以下命令组合实现:
  • MULTI:标记一个事务的开始。
  • 多条命令:在MULTI之后的所有命令会被放入一个队列中,但不会立即执行。
  • EXEC:执行事务队列中的所有命令。
  • DISCARD:取消事务,丢弃队列中的所有命令。

事务的特点:

  • 原子性:事务中的命令要么全部执行,要么全部不执行。当使用EXEC命令时,Redis会一次性执行队列中的所有命令,并且中途不会被打断。
  • 隔离性:在事务执行期间,其他客户端不能看到事务中间的状态,即使事务内的命令未执行完成。
  • 不支持回滚:Redis事务在执行过程中,如果某条命令失败,其他命令仍会继续执行。Redis不会回滚已经执行的命令。

2. 乐观锁

Redis中没有提供直接的锁机制,而是通过CAS(Compare and Set)操作和WATCH命令来实现乐观锁。

乐观锁的实现方式:

  • WATCH:对一个或多个键进行监视。在执行EXEC之前,如果这些键的值发生了变化,事务将被中止。
  • UNWATCH:取消监视。

使用步骤:

  1. 使用WATCH命令监视一个或多个键。
  2. 开启事务(MULTI)并执行一系列命令。
  3. 提交事务(EXEC)。
  4. 如果在WATCH之后,EXEC之前,监视的键被其他客户端修改,EXEC将返回nil,表示事务失败;否则事务将成功执行。

乐观锁的优势:

  • 适合并发环境中读多写少的场景。
  • 避免了使用传统锁带来的性能开销和死锁问题。

3.举例

     此时我想在一个事务中更新多个相关联的键,并希望确保在执行过程中这些键不会被其他客户端修改

WATCH key1 key2
MULTI
SET key1 newValue1
SET key2 newValue2
EXEC

        如果在WATCHEXEC之间,key1key2被其他客户端修改了,EXEC会失败,事务不会执行。这时可以选择重新执行整个操作,确保数据一致性。此时就相当于SQL中的乐观锁功能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 继承与构造函数与析构函数
  • 基于Java+SpringBoot+Vue的师生共评的作业管理系统设计与实现
  • 白酒与旅行日记:探索世界,品味美酒
  • 河南萌新2024第六场
  • 【STM32】定时器
  • 谷歌云AI新作:CROME,跨模态适配器高效多模态大语言模型
  • Python算法工程师面试整理-线性代数
  • 动态规划:从记忆化搜索到递推 打家劫舍
  • Java接口interface(内含练习)
  • 树莓派开发笔记13-树莓派环境下的CSI摄像头实验
  • centos 虚拟机器刚刚安装没有ip地址的问题
  • 微软AI人工智能认证有哪些?
  • ChatGPT不同模型在论文写作中的优势和应用
  • 044—pandas 按组将属性和值转为行
  • GRL CVPR2023图像修复 使用笔记
  • 【391天】每日项目总结系列128(2018.03.03)
  • 2019.2.20 c++ 知识梳理
  • 5、React组件事件详解
  • Android Volley源码解析
  • Codepen 每日精选(2018-3-25)
  • Flannel解读
  • Github访问慢解决办法
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • IOS评论框不贴底(ios12新bug)
  • JS数组方法汇总
  • MySQL数据库运维之数据恢复
  • Node 版本管理
  • pdf文件如何在线转换为jpg图片
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue数据传递--我有特殊的实现技巧
  • 百度小程序遇到的问题
  • 二维平面内的碰撞检测【一】
  • 复杂数据处理
  • 机器学习 vs. 深度学习
  • 码农张的Bug人生 - 初来乍到
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​插件化DPI在商用WIFI中的价值
  • # Kafka_深入探秘者(2):kafka 生产者
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #HarmonyOS:基础语法
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (3) cmake编译多个cpp文件
  • (33)STM32——485实验笔记
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十三)Maven插件解析运行机制
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法)大数的进制转换