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

news2024/11/27 13:45:59

目录

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.coloradmin.cn/o/1023325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机航测没信号?北斗卫星来解决

无人机航测是利用无人机进行地理信息的采集和处理的航测方式。相比传统的航测手段,无人机航测具备更高的灵活性、更低的成本和更广阔的适应性。无人机航测可以应用于土地测绘、农业植保、城市规划、自然资源调查等多个领域,极大地提高了测绘的效率和准确…

【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)

文章目录 创建环境创建专用网络VPC安全组创建云服务器打包部署2. Java环境启动项目开机启动任意服务1. 制作服务文件2. 制作启动脚本3. 制作停止脚本4. 增加执行权限5. 设置开机启动 创建镜像继续创建多台云服务器负载均衡弹性伸缩redis的报警规则白名单1. LAMP 环境1. 安装Apa…

Leetcode每日一题:打家劫舍系列Ⅰ、Ⅱ、Ⅲ、Ⅳ(2023.9.16~2023.9.19 C++)

由于之前写过打家劫舍系列,这里直接弄个合集,后面应该还有个iv。 目录 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III 2560. 打家劫舍 IV 198. 打家劫舍 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都…

详解TCP/IP协议第四篇:数据在网络中传输方式的分类概述

文章目录 前言 一:面向有连接型与面向无连接型 1:大致概念 2:面向有连接型 3:面向无连接型 二:电路交换与分组交换 1:分组交换概念 2:分组交交换过程 三:根据接收端数量分…

植物大战僵尸各种僵尸攻略(四)

前言 此文章为“植物大战僵尸”专栏中的011刊(2023年9月第十刊),欢迎订阅。版权所有。 注意: 1.本博客适用于pvz无名版; 2.pvz指植物大战僵尸(Plants VS Zonbies); 3.本文以耗费低做标准&am…

微信可以定时发朋友圈吗?

你可以使用微信管理系统来自动发布朋友圈,并且可以设置定时发送。这样你就不用守着手机担心朋友圈忘发漏发了,也不会错过发圈的好时间。 功能介绍 01 ​支持一键多号发布,可以进行转发、重发和二次编辑等操作。 02 选择想要发送的时间&…

c语言进阶部分详解(指针进阶1)

大家好!指针的初阶内容我已经写好,可移步至我的文章:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述,直接带大家进入进阶内容: 目录 一.字符指针 1.讲解…

Python py文件打包成 exe文件

文章目录 安装 pyinstaller 模块pyinstaller 的使用pyinstaller 常用参数多文件打包 安装 pyinstaller 模块 pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple在 pyinstaller 模块安装成功之后,在 Python 的安装目录下的 Scripts 目录下会增加…

华为云云耀云服务器L实例评测|用PHP从数据库到后端到前端完整实现一个中秋节祝福语项目

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

小程序隐私弹窗的实现

小程序的开发者对于微信官方来说是有爱有恨,三天二头整事是鹅厂的一贯风格。 隐私弹窗的几个要点 回归正题,小程序隐私弹窗的几个要点: 1、何时弹出用户隐私协议的弹窗? 2、是每次进小程序都弹出来吗? 这两个想明…

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…

scrapyd-完整细节

安装scrapyd服务 pip install scrapyd 安装scrapyd客户端 pip install scrapyd-client 安装好以后重新开启cmd输入命令 scrapyd 出现以下结果代表安装成功 打开浏览器输入网址,即可打开界面客户端 http://127.0.0.1:6800/ 回车后显示一下ok内容代表部署成功 回到服…

系统性能调优:提升服务器响应速度

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

servlet 引用src目录下子目录的class文件方法

1、MyServlet class文件所处的目录结构如下&#xff1a; 2、如果在url里直接引用是不行的&#xff0c;http://localhost:9092/GetRequest_Web_exploded/MyServlet 3、需要在web.xml映射后才行&#xff1a; MyServlet com.example.MyServlet <servlet-mapping><ser…

【少儿编程的网站应该怎么选择】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;效率…

Ubuntu安装中文拼音输入法

ubuntu安装中文拼音输入法 ubuntu版本为23.04 1、安装中文语言包 首先安装中文输入法必须要让系统支持中文语言&#xff0c;可以在 Language Support 中安装中文语言包。 添加或删除语音选项&#xff0c;添加中文简体&#xff0c;然后会有Applying changes的对话框&#x…

vue项目使用vue-video-player实现视频直播功能

文章目录 引言一、基本使用1. 播放mp42. options常用属性3. 常用事件 二、使用videojs-contrib-hls播放m3u8三、视频链接测试工具potplayer 引言 随着互联网的快速发展&#xff0c;视频直播已经成为了越来越受欢迎的一种媒体形式。而在开发一个拥有视频直播功能的网站或应用时…

Java中StringBuilder常见的操作方法

文章目录 1.创建字符串2.追加字符串3.替换字符串4.删除字符串5.插入字符串6.字符串反转7.其他操作 在 Java 中字符串不属于基本数据类型&#xff0c;而是对象。Java 提供了 String 类来创建和操作字符串&#xff0c;但String 类是不可变类&#xff0c;一旦一个 String 对象被创…

Win2016安装安全狗和DVWA

搭建安全狗之前需要先安装XAMPP&#xff0c;XAMPP&#xff08;ApacheMySQLPHPPERL&#xff09;是一个功能强大的建站集成软件包&#xff0c;这个软件包原来的名字是 LAMPP&#xff0c;这个软件类似于phpstudy&#xff0c;功能比phpstudy强大 Download XAMPP (apachefriends.or…

人脸图像数据增强

为什么要做数据增强 在计算机视觉相关任务中&#xff0c;数据增强&#xff08;Data Augmentation&#xff09;是一种常用的技术&#xff0c;用于扩展训练数据集的多样性。它包括对原始图像进行一系列随机或有规律的变换&#xff0c;以生成新的训练样本。数据增强的主要目的是增…