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

深入Redis:事务的理解

在MySql的事务中,有几个很重要的特性,原子性、一致性、持久性、隔离性。

相比于MySql,Redis的事务就没有这么复杂了,要简单很多。

  • 原子性:官网的介绍中,Redis没有原子性。(因为Redis不存在回滚操作)
  • 一致性:Redis没有约束,也没有回滚机制,事务执行过程中如果某个修改操作出现失败,就可能引起不一致的情况。所以Redis事务没有一致性。
  • 持久性:Redis本身就是内存数据库,数据保存在内存中。所以Redis事务没有持久性。
  • 隔离性:Redis是一个单线程模型的服务器程序,所有的请求/事务都是串行的。所以Redis事务没有隔离性。

这四大特性都没有,那Redis事务是来干嘛的呢?

Redis事务最主要的意义,就是为了“打包”,避免其他客户端的命令,插队到中间来~

Redis中实现事务,引入了队列,并且每个客户端都有一个队列。当开启事务的时候,此时客户端输入的命令,就会发送给服务器,并且进入这个队列中,而不是立即执行。当遇到了“执行事务”这个命令的时候才会把队列中这些任务都按照顺序来执行。

实现场景

当左侧客户端set key为111后,想要查询之前,右侧客户端把key更改为222,那么客户端1查询到的value就是222了。

事务操作

  • 开启事务          MULTI     
  • 执行事务          EXEC
  • 放弃当前事务   DISCARD

当使用MULTI命令后,之后的所有命令都会进入队列,直到EXEC命令后才会一次性全都执行完毕。如果没有执行EXEC命令,使用DISCARD命令后,会放弃当前队列中的命令。

WATCH

WATCH可以监控某个key是否在事务执行前发生了改变。

当左侧客户端set key 111后,开始watch这个key,再开启事务。此时右侧客户端set key 222,当watch检测到key被修改了,所以在exec后不会执行set key 333这个操作,exec的返回值为nil。

WATCH 命令的主要作用是实现乐观锁(optimistic locking)。它可以防止在事务执行期间,由于其他客户端的干扰导致数据不一致的问题。

总的来说,Redis的事务还是相当简单的,


http://www.kler.cn/a/291786.html

相关文章:

  • SQL语句整理五-StarRocks
  • 【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互
  • 数据压缩比 38.65%,TDengine 重塑 3H1 的存储与性能
  • 基于langchain的Agent(实现实时查询天气)
  • 方正畅享全媒体新闻采编系统 screen.do SQL注入漏洞复现
  • 【Axure高保真原型】伸缩表单
  • 【机器学习-神经网络】卷积神经网络
  • antv x6 的画布大小设置
  • HBase 源码阅读(一)
  • day01-项目概述、环境搭建
  • 【非零段划分 / 2】
  • MySQL——事务与存储过程(三)存储过程的使用(2) 查看存储过程
  • vs2022 的wpf应用,需要生成的WpfApp1\bin\Debug\WpfApp1.exe添加图
  • 等保测评中的访问控制与用户认证
  • WS2812B驱动
  • CAS
  • 面试总结1
  • 前端模拟面试:如何检查JavaScript对象属性是否存在?
  • 分类预测|基于雪消融优化极端梯度提升的数据分类预测Matlab程序SAO-XGBoost 多特征输入多类别输出
  • 安防监控视频打手机检测算法核心技术打手机检测算法源码、模型简介
  • 阿里云对象存储服务(Aliyun OSS):企业级云存储解决方案
  • 毒枸杞事件启示录:EasyCVR视频AI智能监管方案如何重塑食品卫生安全防线
  • matter消息中的组播和广播
  • 鼠标控制dom元素的大小。采用ResizeObserver——监听元素大小的变化
  • uni-app全局引入js文件
  • .Net 6.0--通用帮助类--FileHelper