逼自己看完,Redis的事务你就掌握了!!!

目录

1、对于事务的理解

1.1、回顾MySQL的事务

1.2、Redis的事务

2、事务命令使用

3、watch的实现原理

3.1、watch用来干什么的?

3.2、watch的实现原理


1、对于事务的理解

1.1、回顾MySQL的事务

在MySQL中,事务有4个特性:

  • 原子性:多个操作打包成一个整体,要么都执行成功,要么都失败
  • 一致性:事务执行前后,数据都要合理
  • 持久性:事务中做出的修改是会保存到硬盘的
  • 隔离性:事务并发执行,各个事务互不干扰

详细可看文章:MySQL事务 

1.2、Redis的事务

  • 无原子性:Redis虽然会将多个操作打包成一个整体,但是Redis中没有回滚机制,所以Redis的事务制作保证这些操作是一起执行,但不能保证全部执行成功或全部失败,而是失败就失败了,不会回滚,前面执行成功的操作成功就成功了~
  • 不保证一致性:因为不涉及到约束,没有回滚机制,导致事务执行前后数据不一定合理。例如MySQL中A给B转账,A成功了,B失败了,A这边就会回滚,前后金额无变化(合理);而在Redis中,A成功了,B失败了,不会回滚A这边,导致A的金额减了,B的却没有加(不合理)
  • 不需要隔离性:Redis是一个单线程的服务器程序,所有的事务都是串行执行的~
  • 不需要持久性:Redis本身就是内存数据库,数据是存储在内存中的,所有不涉及到持久性。Redis中虽然有持久化机制,但这里的持久化和事务是没啥关系的~

那么以上特点都没有,Redis的事务到底用来干啥的?

         Redis的事务其主要意义其实就是打包操作,例如将操作1、2、3、4操作打包在一起,这个事务执行时,就是为了保证执行操作1时,后面就会执行2、3、4,这几个操作是连着执行,中间不会插入操作5来执行~

        也就是说,Redis中实现事务是引入了队列(每个客户端都有一个),开启事务时,此时客户端输入的命令,就会发送给服务器并且进入这个队列中(不是立即执行,先放在对队列中),当遇到了“执行事务”命令的时候,此时就会把队列中的这些任务都按照顺序来一次执行。执行事务是Redis主线程完成的,主线程是先把事务中的操作执行完毕后,再处理别的客户端~

        Redis如果是按照集群模式部署,就不支持事务~

Redis事务为啥不能设计成和MySQL的事务一样强大?

        因为MySQL的事务在背后付出了很大的代价。空间上要花费更多的空间来存储更多的数据;时间上,也要有更大的开销~

        如果Redis的事务也这样设计的话,就会消耗更多的时间和空间,但Redis最重要的一点就是快呀,这岂不是影响了它最重要的一个特点了~


2、事务命令使用

  • 开始事务:multi
  • 执行事务:exec
  • 放弃当前事务:discard

使用举例:

 

        注:当事务开启时,队列中也已经存放了一些操作,此时服务器重启了,这时事务就相当于discard~ 


3、watch的实现原理

3.1、watch用来干什么的?

         注意上述提到过的一句话:Redis中实现事务是引入了队列(每个客户端都有一个

        看以下场景:客户端1开启了事务,并在队列中已经存放了一个key1(value为111),此时客户端2又存放key1(value为222),然后客户端1执行事务,此时redis中key1的value值应该为多少?描述不够清楚,看下图:

 此时redis中key1的value值应该为多少?

        大家也动手试一下,会看到值为111,因为事务中的操作只是放在队列中,还没有执行,执行命令exec时,才真的执行了事务中的操作~

        那如果我们想要保证,值为222怎么办?

        需要使用watch来监控一下某个key是否在事务执行之前发生了改变,也支持同时监控多个key~

使用举例:

        我们会发现,使用watch监控后,只要其他客户端有修改被监控的key时,事务执行就会执行失败(事务中的所有操作都不行)

注意:watch命令执行需要在事务开启之前~

        总的来说就是,不使用watch时,哪个是最终执行的操作,最终的值就是谁,使用watch监控后,除了事务所在的这个的客户端如果对key有修改,则事务就会执行失败~

3.2、watch的实现原理

        使用watch监控时,在事务开启之前就会记录当前的key的版本号,如果其他客户端对key有修改,版本号就会随之被修改,当事务提交时,当前服务器就会检查key的版本号,如果不是事务开启时的版本号,则会直接让事务执行失败~

好啦,下期见咯~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/136539.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办

方法1: 在mybatis核心配置文件中指定,springboot加载mybatis核心配置文件 springboot项目的一个特点就是0配置,本来就省掉了mybatis的核心配置文件,现在又加回去算什么事,总之这种方式可行但没人这样用 具体操作&…

详细介绍如何微调 YOLOv8 姿势模型以进行动物姿势估计--附完整源码

动物姿势估计是计算机视觉的一个研究领域,是人工智能的一个子领域,专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一只或多只动物身体部位的空间排列,例如头部、四肢和尾巴。这项技术具有广泛的应用,从研究动物行为和生物力学到野生动物保护和监测。 …

【LeetCode-中等题】107. 二叉树的层序遍历 II

文章目录 题目方法一:队列层序迭代 题目 方法一:队列层序迭代 解题详情:【LeetCode-中等题】102. 二叉树的层序遍历 res.add(0,zres); //效果是将 zres 列表作为 res 的第一个子列表,并将其它原本在第一位置及之后的子列表向后移…

Python项目开发:Flask基于Python的天气数据可视化平台

目录 步骤一:数据获取 步骤二:设置Flask应用程序 步骤三:处理用户输入和数据可视化 步骤四:渲染HTML模板 总结 在这个数字化时代,数据可视化已经成为我们理解和解释信息的重要手段。在这个项目中,我们…

JavaScript速成课—事件处理

目录 一.事件类型 1.窗口事件 2.表单元素事件 3.图像事件 4.键盘事件 5.鼠标事件 二.JavaScript事件处理的基本机制 三.绑定事件的方法 1.DOM元素绑定 2.JavaScript代码绑定事件 3.监听事件函数绑定 四.JavaScript事件的event对象 1.获取event对象 2.鼠标坐标获取…

下载HTMLTestRunner并修改

目录 一. 下载HTMLTestRunner 二. 修改HTMLTestRunner 1. 修改内容 2. 修改原因 一. 下载HTMLTestRunner 下载报告模板地址:http://tungwaiyip.info/software/HTMLTestRunner.html 下载模块: 二. 修改HTMLTestRunner 将修改后的模块放到python安装目录下的..…

Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果

相信大家都已经听说过,明年的 Harmony Next 版本将正式剥离 AOSP 支持 ,基于这个话题我已经做过一期问题汇总 ,当时在现有 App 如何兼容 Harmony Next 问题上提到过: 华为内部也主导适配目前的主流跨平台方案,主动提供…

QT在安装后添加新组件【QT基础入门 环境搭建】

一、Qt的安装目录下找到MaintenanceTool工具 二、双击该exe文件运行该工具(界面可能不相同但功能一样) 登录账号,进入以下界面,点击下一步 选择更新组件,出现以下提示 三、此时需要手动添加储存库 1.进入下面网站,选择一个国内镜像 Qt Downloads 点击后面的HTTP可进入…

info文档与man手册

man 手册 man --version# 查看版本 man 2 socket# 查看section2中的socket yum install man-pages# 更新man手册man -f socket# 列出所有章节的socket # man -f刚开始使用的时候不显示 # centos7执行mandb命令,7以下的版本执行makewhatis命令 # 之后执行man -f就生效了 [rootk…

Jmeter —— 常用的几种断言方法(基本用法)

在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言,断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过,本文 主要介绍几种常用的断言&…

计算机算法分析与设计(3)---循环赛日程表(含代C++码)

循环赛日程表 一、内容概述二、代码实现2.1 分治代码2.2 结果图 一、内容概述 二、代码实现 2.1 分治代码 // 循环赛日程表 #include<iostream> #include<cmath> using namespace std;void schedule(int k, int n, int** array) // 数组下标从1开始 {for (int …

数字孪生基础设施需求分析

数字孪生基础设施需求分析 “基础设施”&#xff08;infrastructure&#xff09;新型基础设施建设 “基础设施”&#xff08;infrastructure&#xff09; 一词最早于1875年在法文中出现&#xff0c;但该词汇由拉丁文构成&#xff0c;infrastructure分为infra&#xff08;拉丁文…

win10 安装 Langchain-Chatchat 避坑指南(2023年9月18日v0.2.4版本,包含全部下载内容!)

网上教程都是基于外网或者翻墙的&#xff0c;而且细节极其不清晰&#xff0c;尤其是最关键的模型下载。 另外提一句&#xff0c;我的显卡是&#xff1a;3080Ti 16GB版本&#xff0c;运行之后&#xff0c;显存占用13-14GB 1、安装Anaconda&#xff08;这个就不啰嗦了&#xff0c…

Idea创建springboot项目

1、选择file—>new –->project 2、选择“Spring Initializr”&#xff0c;点击“next”&#xff0c;进入工程信息配置界面修改配置信息. 备注&#xff1a;type类型选择“Maven(Generate a Maven based project achieve)”&#xff0c;生成工程路径。 3、点击next按钮&a…

最全测试管理岗面试题(上)

1、怎么改善团队低迷现状&#xff1f; 改善团队低迷的现状是一个重要的管理挑战。以下是一些可能有助于改善团队状态的方法&#xff1a; ① 深入了解问题&#xff1a;首先&#xff0c;需要了解低迷的原因。这可能涉及与团队成员的个人会谈&#xff0c;收集反馈&#xff0c;观…

Java微信支付集成开发

文章目录 [toc] 1.接入前准备1.1 微信商户平台注册商户号1.1.1 微信支付商户接入指引1.1.2 微信支付服务商接入指引 1.2 微信开放平台注册小程序和公众号1.3 微信开放平台注册开发者账号1.4 微信商户平台绑定小程序和公众号的appId账号1.4.1 微信公众平台扫码登录微信公众号账号…

C++:初始化列表,static成员,友元,内部类

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 文章目录 前言一、初始化列表二、static成员三、友元四、内部类总结 前言 本篇博客作为C&#xff1a;初始化列表&#xff0c;static成员&#xff0c;友元&#xff0c;内部类的知识总结。 一…

Git学习笔记7

github上多人协助开发演示过程&#xff1a; 张三是项目作者。 李四是一个协同的用户。觉得项目不错&#xff0c;想增加一些功能。 clone与fork的区别&#xff1a; clone&#xff1a;任何人都可以下载作者的整个项目&#xff0c;但是非作者不能push到作者的项目里。&#xff…

MDPI模板报错的问题---提示缺少sty文件

MDPI模板报错的问题—提示缺少sty文件 平时大多数提交IEEE trans模板时大多使用CTEX编译&#xff0c;然而&#xff0c;MDPI模板需要用texlive&#xff0c;二者之间如果先安装CTEX后安装texlive将会导致库文件的冲突。结果将会报缺少sty的文件错。网上提供了很多解决方案&#…

CKA 真题练习(十六)备份还原etcd

题目&#xff1a; 首先&#xff0c;为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db (注意&#xff0c;真实考试中&#xff0c;这里写的是 https://127.0.0.1:2379) 为给定实例创建快照预计能在几秒钟内完成。 …