「Redis」06 事务与锁机制

news2024/11/13 14:33:26

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程

Redis——事务与锁机制

1. Redis的事务定义

  • Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 注意Redis 的事务与 MySQL 的事务不同
    • Redis 事务的主要作用就是串联多个命令防止别的命令插队。

2. 事务基本命令 (Multi、Exec、Discard)

从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入 Exec 后,Redis 会将之前的命令队列中的命令依次执行。

组队的过程中可以通过 Discard 来放弃组队。

image-20220921203522475

案例

  • 组队成功,提交成功

    image-20220921203635350

  • 放弃组队

    image-20220921203639095

  • 组队中有命令错误,所有命令都不会执行

    image-20220921203642231

  • 组队中不报错,执行时报错(只有错误的命令没有执行)

    image-20220921203649337

3. 事务的错误处理

发生错误的时机有两种情况:

  • 组队阶段出错

    • 组队中某个命令出现了报告错误,执行时 整个队列的任务都会被取消

    image-20220921203837463

  • 执行阶段出错

    • 如果执行阶段某个命令报出了错误,则 只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

    image-20220921203916020

4. Redis事务三特性

  • 单独的隔离操作
    • 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 没有隔离级别的概念
    • 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
  • 不保证原子性
    • 事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

5. 事务冲突的问题

为什么要做成事务?

想想一个场景:有很多人有你的账户,同时去参加双十一抢购。

Ⅰ. 例子

  • 一个请求想给金额减 8000 8000 8000
  • 一个请求想给金额减 5000 5000 5000
  • 一个请求想给金额减 1000 1000 1000

如果三个请求进来并发的执行可能会产生冲突问题,最极端的如下图这种情况:

image-20220921204359658

没有加事务,互相产生影响。

解决方式使用加锁的方式:

  • 悲观锁
  • 乐观锁

Ⅱ. 悲观锁

  • 悲观锁(Pessimistic Lock,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。

image-20220921204724319

  • 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
    • Java 中,synchronized 从偏向锁、轻量级锁到重量级锁,全是悲观锁。JDK 提供的 Lock 实现类全是悲观锁。

效率低,只能一个人一个人进行操作,不能多人同时进行。

Ⅲ. 乐观锁

  • 乐观锁(Optimistic Lock,顾名思义,就是很乐观,即每次去拿数据的时候都认为其他线程不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间有没有其他线程去更新这个数据,可以使用版本号等机制。
  • 乐观锁适用于多读的应用类型,这样可以提高吞吐量
  • Redis 就是利用这种 check-and-set 机制实现事务的。

image-20220921204731131

Ⅳ. WATCH

  • 在执行 multi 之前,先执行 watch key [key...],可以监视一个(或多个)key

  • 如果在事务执行之前这个 key 被其他命令所改动,那么事务将被打断。

    • 测试

      • 进程1监控balance,并进行修改操作:

      image-20220921212703302

      • 进程2也监控balance,进行修改操作,事务被打断:

      image-20220921213008067

    • 这是一个乐观锁的过程,进程1先执行,把balance的版本号进行修改,而进程2再执行时 判断发现版本号不一样,取消操作。

Ⅴ. UNWATCH

  • 取消 WATCH 命令对所有 key 的监视。
  • 如果在执行 WATCH 命令之后,EXEC 命令或 DISCARD 命令先被执行,那么就不需要再执行 UNWATCH

补充:通过WATCH命令可以实现乐观锁的功能,无法实现悲观锁操作。

但是可以通过编写LUA脚本,让Redis加载脚本,从而实现悲观锁。

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

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

相关文章

[附源码]Python计算机毕业设计SSM教师业绩考核和职称评审系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

D-024 VGA硬件电路设计

VGA硬件电路设计1 简介2 引脚定义3 硬件电路实战4 硬件设计要点1 简介 VGA(Video Graphic Arrary)即视频图形阵列,是 IBM(国际商业机器公司)在 1987 年随 PS/2 机一起推出的使用模拟信号的一种视频传输标准,在当时具有分辨率高、…

基于STM32的智能GPS定位系统(云平台、小程序)

背景及目标 前阵子,准确的说是好几个月前买了一辆电瓶车,当时呢因为车停得很随意,所以想给小电驴装一个GPS,一方面是防盗,另一方面是为了测速和绘制骑行轨迹,要是能联动电瓶车状态远程监测就更好了。当然我…

马上年末了,你还不会写测试总结吗?

最近参与了几次面试,面试者的简历中都会提及:需求或者版本测试结束后会进行测试总结,不仅仅提供一份测试报告以及相关文档手册。 于是特意追问了一下,测试总结中都包含什么内容。 答复上基本都是:执行了多少用例、发…

帝国cms漏洞分析前台XSS漏洞

帝国cms漏洞分析前台XSS漏洞 一、帝国cms漏洞描述 该漏洞是由于javascript获取url的参数,没有经过任何过滤,直接当作a标签和img标签的href属性和src属性输出。 二、帝国cms漏洞复现 1、需要开启会员空间功能(默认关闭),登录后台开启会员空间功能。 2、漏洞出现的位置在/…

AR+GIS赋能地下管线,匹配真实位置

地下管线是城市运行的生命线,对保障城市运行起到至关重要的作用。但是地下管线都埋藏于地下看不见,摸不着,当工程师需要查看或者检修地下管线时往往就不那么方便了,经常发生破坏地下管线的事故,那有没有什么技术可以让…

122页6万字消防大数据平台建设方案

目 录 第1章 设计说明 1.1 工程概述 1.1.1 工程名称 1.1.2 承建单位 1.1.3 建设目标 1.1.4 建设内容 1.1.5 建设规模 1.1.6 建设周期 1.2 设计依据 1.3 相对可行性研究报告批复的调整情况 1.4 合理化建议 1.4.1 统一、开放的通讯协议标准 1.4.2 充分利用联网单位消…

Git分支管理,运维知道吗?

需求 对于代码的管理,不知你是否遇到过以下几种情况: 存在多种版本管理工具,如svn、git,无法做到代码统一管理;多人协作开发,代码合并冲突频发;分支管理混乱,存在很多个性化分支&a…

常用工具类之spring-boot-devtools热部署

SpringBoot热部署 热部署不会用在生产环境,但对于程序员开发的效率,还是有一定帮助的,所谓的热部署,就是在应用程序在不停止的情况下,实现新的部署 spring-boot-devtools 是一个为开发者服务的一个模块,其中…

JAVA小区门户网站(源代码+论文)

小区门户网站之社区共享 摘 要 随着计算机的不断发展和广泛应用,人们的工作效率得到不断的提高。互联网的发展,更是缩短了人们之间的距离。如何充分利用互联网,这是大家共同关心的问题。本文主要介绍了关于小区门户网站之社区共享的实现方法…

【GD32F427开发板试用】IAR flash loader 下载GD32F427流程简要分析

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:andeyqi 很高兴获的社区的GD32F427开发板的评测机会,这几年芯片慌大家都能感受到,项目上经常因为货源紧张不断更换替代…

java面向对象 继承 多态

目录 继承性(inheritance) 为什么要有继承? 作用: 继承举例 方法的重写 重写举例 四种访问权限修饰符 关键字—super 关键字super举例 调用父类的构造器 调用父类构造器举例 子类对象的实例化过程 多态性 概念 使用 多态性应用举例 虚…

探花交友_第6章_圈子互动(新版)

探花交友_第6章_圈子互动(新版) 文章目录探花交友_第6章_圈子互动(新版)课程说明1. 动态查询1.1 查询好友动态1.1.1 接口文档1.1.2 代码步骤1.1.3 代码实现tanhua-app-server**MovementController****MovementService**tanhua-dub…

centos7磁盘挂载及目录扩容

centos7磁盘挂载及目录扩容1. Linux文件系统介绍1.1 ext21.2 ext41.3 xfs2. 查看磁盘现状2.1 查看硬盘情况2.2 查看磁盘挂载情况3. 磁盘挂载3.1 mount挂载3.2 通过UUID来进行挂载4. 目录扩容5. 参考资料项目申请的服务器资源,初始化阶段,运维人员未及时考…

ES 8.x 新特性:match_phrase 跨值查询中 position_increment_gap 参数用法

文章目录1、概述2、match_phrase 短语搜索3、跨值访问3.1 问题演示3.2 原因3.3 解决方案3.4 position_increment_gap 参数1、概述 在 ES 中进行短语搜索的时候,为了防止跨值访问,ES 会在每个值之间设置间隙,而这个间隙的默认大小为 100。而这…

【密码学篇】商用密码产品的密钥体系结构小结

【密码学篇】商用密码产品的密钥体系结构小结 商用密码产品的密钥体系结构笔记小结—【蘇小沐】 文章目录【密码学篇】商用密码产品的密钥体系结构小结1.商用密码产品密钥体系结构(一)服务器密码机密钥体系结构1.服务器密码机密钥体系结构2.服务器密码机…

MySQL 数据库 定义参数【连接查询】

目录 内连接查询(inner join) 左连接查询 left join 右连接 right join 全连接、合并查询 union 内连接查询(inner join) 关键字:inner join on 语句:select * from 表名 inner join 表名 on 条件…

Excel

单元格格式 ,跨列居中, 自动换行 尽量不要使用合并单元格,因为会使得一些单元格无法访问,影响排序,筛选等功能 第四季度销售数据部门类别十月十一月十二月肉类牛肉90000110000120000烘焙品甜点2500080000120000农产品…

基于JAVA的网络通讯系统设计与实现(论文+系统)

(2009届) 本科生毕业设计(论文) 基于Java的网络通信系统设计与实现 学 院、系:计算机与通信学院专 业:通信工程学 生 姓 名:班 级:学号指导教师姓名:职称最终评定成绩…

jest在已有项目中的安装与使用

简单的jest使用配置: npm init -y npm i jest24.8.0 -Dnpx jest --init 生成初始化配置 一个index文件,里面可以写入一些方法,作为测试这个jest.config.js是自动生成的!!!!! index.…