Redis事物操作

  • Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
    • 批量操作在发送 EXEC 命令前被放入队列缓存。
    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
    • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
  • 一个事务从开始到执行会经历以下三个阶段:
    • 开始事物->命令入队->执行事务|取消事物
  • 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
  • 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
  • 队列中间有命令执行错误
    • 错误包含
      • 编译型错误(代码写的有问题),命令写错了,这个时候所有的命令都不会执行
      • 其中getset k1 是语法错误
      • 运行时错误,不会影响到成功的命令执行结果,不会回滚
      • 对字符串进行累加,属于运行时错误,可以去到k2,只有第一行命令错误,不会影响其他的
  • Redis事物具有以下特性
    • 一次性
    • 顺序性
    • 排他性

开始事务。

  • multi

命令入队。

  • 要执行的Redis命令

执行事务。

  • exec

取消事物

  • discard
  • 事物取消后无法提交,入队的命令也不会执行

监视(实现乐观锁)

  • 悲观锁
    • 很悲观,认为什么时候都会出问题,无论做什么都加锁
  • 乐观锁
    • 很乐观,认为什么时候都不会出现问题,所以不会加锁,更新数据的时候,判断一下,在此期间是否有人改动过数据
    • 获取version
    • 更新时比较version
  • watch key[key循环]
    • 事物正常结束,数据期间没有发生变动,这个时候就正常执行成功(就是看你的钱,在你花的期间,有没有人动过)
    • 一但事物执行成功监控就会取消
    • 在链接一个客户端(测试失败)
    • A线程准备执行事物并监控qian这个key,然后命令入队,但是还没有执行提交
    • B线程在这个时候对qian这个key的值进行修改
    • B线程重置成1000
    • A线程开始提交事物
    • 提交后返回空,因为监控的变量qian被修改过,所以不做任何操作
    • ok,也相当于事物回滚了
    • 测试会不会有ABA问题
    • A线程
    • B线程
    • A线程
    • 经过测试发现,不会存在ABA问题

取消监视

  • unwatch
  • 取消全部的监视
    • 经过测试多个进程取消监视不会影响其他已开启事物的监视
    • A线程
    • B线程
    • A线程
    • 返回结果为空,所以监视并没有被取消
  • Redis事物详解(来自小姐姐的面试题71)
  • A原子性:命令要么一起执行,要么一起不执行,没有mysql的rollback
  • C一致性:执行到一半可恢复
  • I持久性:RDB和AOF两个持久化机制
  • D隔离性:redis是单线程,没有mysql中可见性的问题
  • 事务开始:执行MULTI命令,标志着事务的开始,该命令会将客户端状态的flags属性中的REDIS_MULTI标示打开
  • 命令入队:当客户端切换到事务状态后,服务器会根据这个客户端发来的命令执行不同的操作:
    • 如果发送命令为MULTI(事务开始)、EXEC(事务执行)、WATCH(监控key值)、DISCARD(结束事务)命令中的一个,则立即执行
    • 如果是其他命令,则不执行。先检查命令是否正确,无语法错误,如不正确,服务器会在客户端状态redisClient的flags属性关闭;如果正确,将这个命令放入一个事务队列,并向客户端返回QUEUED回复
    • 事务队列按照FIFO(先进先出)的方式保存入队的命令
  • 事务执行:客户端发送EXEC命令,服务器执行事务。
    • 客户端状态flags属性不包含REDIS_MULTI标示,或包含REDIS_DIRTY_CAS或REDIS_DIRTY_EXEC标示,直接取消事务执行
    • flags中有REDIS_MULTI标示,无xxxCAS或xxxEXEC标示,服务器会遍历客户端的事务队列,并执行事务队列中的所有命令,将返回结果全部返回给客户端
    • redis不支持事务回滚机制,但会检查每一个事务命令是否有语法错误;redis事务不支持检查程序员的逻辑错误,如对String类型对数据库执行hashMap类型的操作
  • WATCH命令:乐观锁,可以为redis事务提供check-and-set(CAS)行为。可以监控一个或多个键,一旦其中一个键被修改或删除,之后的事务就不会执行,监控一直延续到EXEC命令。可在MULTI命令之前或其执行中。
  • MULTI命令:用于开启事务,返回永远是ok。客户端可以继续向服务器发送任意多条命令,不会执行,放入命令队列,当EXEC命令被调用时,所有队列中的命令先进先执行
  • EXEC命令:执行所有事务块内的命令,返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值null
  • DISCARD命令:清空事务队列,并放弃执行事务,客户端会从事务状态中退出
  • UNWATCH命令:取消watch对所有key的监控

作者:彼岸舞

时间:2021\05\05

内容关于:Redis

本文属于作者原创,未经允许,禁止转发

Redis系统学习之事物的更多相关文章

  1. Redis 系统学习目录

    Redis 系统学习目录 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8. ...

  2. Redis系统学习 五、管理

    在最后一章里,我们将集中谈论Redis运行中的一些管理方面内容.这是一个不完整的Redis管理指南,我们将会回答一些基本的问题,初接触Redis的新用户可能会很感兴趣. 配置(Configuratio ...

  3. Redis系统学习 二、数据结构

    一.字符串     1.在Redis里,字符串是最基本的数据结构.当你在思索着关键字-值对时,你就是在死锁着字符串数据结构.不要被名字给搞混了. 常见实例: set users:leto " ...

  4. Redis系统学习之SpringBoot集成Redis操作API(集成SpringDataRedis及其分析)

    SpringDataRedis调用Redis底层解读 在SpringBoot2.X之前还是直接使用的官方推荐的Jedis连接的Redis 在2.X之后换为了lettuce Jedis:采用直接连接,多 ...

  5. Redis系统学习

    准备写一些关于Redis学习的文章的,发现网上有N多资料有人已经做了总结.查看这些Redis资料,按次序浏览这些Redis资料,相信想学习Redis的同学会很快熟悉: 1.Redis学习手册(目录) ...

  6. Redis系统学习 四、超越数据结构

    5种数据结构组成了Redis的基础,其他没有关联特定数据结构的命令也有很多.我们已经看过一些这样的命令:info,select,flushdb,multi,exec,discard,watch,和ke ...

  7. Redis系统学习 三、使用数据结构

    前言:上一章,简单介绍了5种数据结构,并给出了一些用例.现在是时候来看看一些高级的,但依然很常见的主题和设计模式 一.大O表示法(Big O Notation ) 常用时间复杂度O(1)被认为是最快速 ...

  8. Redis系统学习 一、基础知识

    1.数据库 select 1  select 0 2.命令.关键字和值 redis不仅仅是一种简单的关键字-值型存储,从其核心概念来看,Redsi的5种数据结构中的每一个都至少有一个关键字和一个值.在 ...

  9. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

随机推荐

  1. 看完我的笔记不懂也会懂----MarkDown使用指南

    目录 语法 [TOC] 自动生成目录 1. 标题 2. 文本强调 3. 列表 4. 图片 5. 超链接 6. 文本引用 7. 分割线 8. 代码 9. 任务列表 (MPE专属) 10. 表格 11. ...

  2. 用量子计算模拟器ProjectQ生成随机数,并用pytest进行单元测试与覆盖率测试

    技术背景 本文中主要包含有三个领域的知识点:随机数的应用.量子计算模拟产生随机数与基于pytest框架的单元测试与覆盖率测试,这里先简单分别介绍一下背景知识. 随机数的应用 在上一篇介绍量子态模拟采样 ...

  3. 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题

    剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...

  4. HDOJ-3001(TSP+三进制状态压缩)

    Traving HDOJ-3001 这题考察的是状态压缩dp和tsp问题的改编 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2 这里可以模仿tsp问题的二进制压缩方法 ...

  5. HDOJ-1358(字符串压缩+KMP)

    Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...

  6. Java变量-常量-作用域

    public class Demo05 { /* 变量的命名规范:见名知意 1.类变量/实例变量/局部变量使用驼峰原则命名 2.类名使用Pascal命名法 3.常量名使用大写字母和下划线 4.驼峰原则 ...

  7. golang-Zap和Go Logger日志库

    目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...

  8. Prometheus + Spring Boot 应用监控

    1.  Prometheus是什么 Prometheus是一个具有活跃生态系统的开源系统监控和告警工具包.一言以蔽之,它是一套开源监控解决方案. Prometheus主要特性: 多维数据模型,其中包含 ...

  9. Spring AOP的源码流程

    一.AOP完成日志输出 1,导入AOP模块 <dependency> <groupId>org.springframework</groupId> <arti ...

  10. 多种细分方式浏览销售数据,IAP助您有效洞察市场收益效果

    华为应用内支付服务是直接在应用程序内提供购买商品或订阅等功能,为了能够让开发者更好的了解应用内的销售额及商品购买.订阅的市场收益效果,华为应用内支付服务提供的消费数据统计和数据报表,支持多种细分方式浏 ...