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

13.Redis 事务

Redis 事务

  • redis 事务
    • 事务操作
      • multi 开启事务
      • exec 执行事务
      • discard 放弃当前事务
      • watch
      • unwatch

redis 事务

Redis 的事务和 MySQL 的事务概念上是类似的。 都是把⼀系列操作绑定成⼀组。 让这⼀组能够批量执⾏。
Redis 的事务和 MySQL 事务的区别:

  • 弱化的原⼦性: 这里指的是 redis 能够做到把多个操作打包到一起,要么全部执行,要么全都不执行,但是不保证事务执行后一定是成功,事务执行失败后,失败就失败,不进行回滚操作。所以以 mysql的事务的原子性来说,redis可以说是没有原子性。
  • 不具备⼀致性: 不涉及 “约束”。也没有回滚。 MySQL 的⼀致性体现的是运⾏事务前和运⾏后, 结果都是合理有效的, 不会出现中间⾮法状态。
  • 不涉及隔离性: redis 是一个单线程模型的服务器程序,所有的 请求/事务,都是”串行“执行的,也没有隔离级别, 因为不会并发执⾏事务 (redis 单线程处理请求) 。
  • 不具备持久性: 数据是保存在内存的。是否开启持久化, 是 redis-server ⾃⼰的事情, 和事务⽆关。

Redis 事务本质上是在服务器上搞了⼀个 “事务队列”。
开启事务的时候,此时客户端输入的命令,就会发给服务器并且进入这个队列中(而不是立即执行)。当遇到了”执行事务“命令的时候,此时就会把队列中的这些任务都按顺序一次执行。(这些都是在 redis 主线程中完成的)

事务操作

multi 开启事务

作用:开启⼀个事务. 执⾏成功返回 OK.
在这里插入图片描述
每次添加⼀个操作,都会提⽰ QUEUED", 说命令已经进⼊客户端的队列了

exec 执行事务

作用:真正执⾏事务.
在这里插入图片描述

discard 放弃当前事务

在这里插入图片描述

当开启事务,并且给服务器发送了若干个命令之后,此时服务器重启,此时的这个事务该怎么办呢?
此时的效果其实就等同于 discard命令。

watch

作用:在执⾏事务的时候, 如果某个事务中修改的值, 被别的客户端修改了, 此时就容易出现数据不⼀致的问题。

在开启事务之前执行watch

如下图所示:
在这里插入图片描述
假设此时有一个 key,value 为 111,此时有两个客户端,客户端1先开启一个事务,并将key的value设置为222,此时客户端2不开启事务直接set key 333,此时客户端1执行exec命令,让其执行事务,此时就容易引起歧义,是到底key的值是222还是333呢。其实是222。
watch 命令就是⽤来解决上述这个问题的。watch 在该客户端上监控⼀组具体的 key.

  • 当开启事务的时候, 如果对 watch 的 key 进⾏修改, 就会记录当前 key 的 “版本号”. (版本号是个简单的整数, 每次修改都会使版本变⼤. 服务器来维护每个 key 的版本号情况)
  • 在真正提交事务的时候, 如果发现当前服务器上的 key 的版本号已经超过了事务开始时的版本号, 就会让事务执⾏失败. (事务中的所有操作都不执⾏).

在这里插入图片描述

unwatch

取消对 key 的监控。

http://www.lryc.cn/news/154623.html

相关文章:

  • 李宏毅机器学习课程笔记(更新ing)
  • SIP mini 对讲终端,带sip热点功能
  • PHP中根据出生年月日计算年龄的封装函数
  • Linux巡检脚本
  • SQLite 3.43.0 发布,又有啥新功能?
  • 百度自研高性能ANN检索引擎,开源了
  • golang遍历map的方法
  • 如何让Android平台像网络摄像机一样实现GB28181前端设备接入?
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁 | 京东云技术团队
  • SpringMVC入门篇
  • 面经:安卓学习笔记
  • Java设计模式:四、行为型模式-06:观察者模式
  • vscode中讨厌的蓝色波浪线的去除小trick和原理
  • 开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿
  • AcWing 787:归并排序
  • SeamlessM4T—Massively Multilingual Multimodal Machine Translation
  • Python数据分析-Numpy
  • 【真题解析】系统集成项目管理工程师 2023 年上半年真题卷(案例分析)
  • 【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)
  • 金蝶云星空二开,公有云执行SQL
  • JAVA String 二维的字符串数组 String[][]
  • 【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?
  • el-dialog设置高度、使用resetFields清除表单项无效问题
  • MySql切换到达梦数据库,各种问题解决记录
  • 2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆
  • vscode中使用eslint+prettier的配置
  • HTML 标签讲解
  • ue5 小知识点 ue的world type,pie editor game
  • 两表union 如何保证group by 字段唯一
  • 【⑰MySQL】 变量 | 循环 | 游标 | 处理程序