1.Redis的事务是什么

Redis 事务的本质是一组命令的集合,事务支持一次执行多个命令,一个事务中所有命令都会被序列化。(redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令).

1.1reids事务的特点

  1. 事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行

  2. 在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中

  3. Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入

1.2.Redis的常用操作

MULTI, EXEC, DISCARD and WATCH 是Redis事务的基础用来显式开启并控制一个事务,它们允许在一个步骤中执行一组命令。并提供两个重要的保证:

  1. 事务中的所有命令都会被序列化并按顺序执行。在执行Redis事务的过程中,不会出现由另一个客户端发出的请求。这保证 命令队列 作为一个单独的原子操作被执行。

  2. 队列中的命令要么全部被处理,要么全部被忽略。EXEC命令触发事务中所有命令的执行,因此,当客户端在事务上下文中失去与服务器的连接.

1.2.1MULTI 命令

用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列。 这个命令的运行格式如下所示:MULTI

这个命令的返回值是一个简单的字符串,总是OK。

1.2.2. EXEC命令

在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令,这种方式利用了检查再设置(CAS)的机制()。这个命令的运行格式如下所示:EXEC

这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值。(如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会被执行)

1.2.3. DISCARD命令

清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。如果使用了WATCH命令,那么DISCARD命令就会将当前连接监控的所有键取消监控。这个命令的运行格式如下所示:DISCARD

这个命令的返回值是一个简单的字符串,总是OK。

1.2.4. WATCH命令

当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的.

1.Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

2.通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。 这个命令的运行格式如下所示:WATCH key [key …]

这个命令的返回值是一个简单的字符串,总是OK。对于每个键来说,时间复杂度总是O(1)。

1.2.5. UNWATCH命令

清除所有先前为一个事务监控的键。如果你调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。这个命令的运行格式如下所示:UNWATCH

这个命令的返回值是一个简单的字符串,总是OK。时间复杂度总是O(1)。

2.Redis 事务的三个阶段

Redis 中的事务从开始到结束也是要经历三个阶段:开启事务,命令入列,执行事务/放弃事务

2.1开启事务阶段

1.multi 命令用于开启事务

​ 2.multi 命令可以让客户端从非事务模式状态,变为事务模式状态,如下图所示

3.注意:multi 命令不能嵌套使用,如果已经开启了事务的情况下,再执行 multi 命令,会提示如下错误:

错误:(error) ERR MULTI calls can not be nested执行效果,如下代码所示:127.0.0.1:6379> multi
OK
127.0.0.1:6379> multi
(error) ERR MULTI calls can not be nested

4.当客户端是非事务状态时,使用 multi 命令,客户端会返回结果 OK ,如果客户端已经是事务状态,再执行 multi 命令会 报不能嵌套的错误,但不会终止客户端为事务的状态, 如下图所示

2.2命令入列阶段

1.客户端进入事务状态之后,将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面, 命令入列成功后会返回 QUEUED,如下代码所示:

> multi
OK
> set k v
QUEUED
> get k
QUEUED

2.命令会按照先进先出(FIFO)的顺序出入列,也就是说事务会按照命令的入列顺序,从前往后依次执行。

执行流程如下图所示:

2.3执行事务/放弃事务阶段

执行事务的命令是 exec ,放弃事务的命令是 discard

执行事务示例代码如下:

> multi
OK
> set k v2
QUEUED
> exec
1) OK
> get k
"v2"

放弃事务示例代码如下:

> multi
OK
> set k v3
QUEUED
> discard
OK
> get k
"v2"

3.事务错误&回滚

事务执行中的错误分为以下三类:

1.执行时才会出现的错误(简称:执行时错误)

2.入列时错误,不会终止整个事务;

3.入列时错误,会终止整个事务。

3.1执行时错误

从以下实例结果可以看出,即使事务队列中某个命令在执行期间发生了错误,事务也会继续执行,直到事务队列中所有命令执行完成。

3.2入列时,错误不会导致事务结束

从以下实例结果可以看出,重复执行 multi 会导致入列错误,但不会终止事务,最终查询的结果是事务执行成功了。除了重复执行 multi 命令,还有在事务状态下执行 watch 也是同样的效果

3.3入列错误会导致事务结束

3.4为什么不支持事务回滚?

不支持事务回滚的原因有以下两个:

1.Redis事务的执行时,错误通常都是编程错误造成的,这种错误通常只会出现在开发环境中,而很少会在实际的生产环境中出现,所以他认为没有必要为 Redis 开发事务回滚功能;

2.不支持事务回滚是因为这种复杂的功能和 Redis 追求的简单高效的设计主旨不符合。

4.Redis事务的三个特性

1.单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2.没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个

3.不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

5.悲观锁与乐观锁

1.悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

2.乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量;乐观锁策略:提交版本必须大于记录当前版本才能执行更新

Redis之Redis的事务相关推荐

  1. 【Redis学习】Transaction事务管理

    1.相关命令: (1)MULTI 标记一个事务块的开始.事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行. 返回值:总是返回 OK . redis ...

  2. redis(19)--事务

    目录 事务实现 事务开始 命令入队 事务队列 执行事务 WATCH命令 WATCH 命令的实现 WATCH 的触发 事务是否安全 事务的ACID性质 原子性 一致性 入队错误 执行错误 Redis 进 ...

  3. jedis对redis键加锁+解锁+事务提交

    [README] redis的java客户端对键加锁和解锁(Jedis.watch()   Jedis.unwatch()  ): [1]代码 /*** redis加锁-watch * [场景描述]: ...

  4. redis笔记——redis事务及锁应用

    1.redis支持简单的事务 2.redis 和 mysql事务的对比 Mysql Redis 开启 start transaction multi(并不执行,放在一个队列里) 语句 普通sql 普通 ...

  5. 华为云企业级Redis讲解第16期:超越开源Redis的ACID“真“事务

    摘要: 开源Redis只支持伪事务,应用场景受限.高斯Redis发布企业级事务特性,支持完备ACID,为交易.库存等上层业务带来全新可能. 本文分享自华为云社区<华为云企业级Redis揭秘第16 ...

  6. php redis事务回滚,【Redis】Redis事务详解,Redis事务不支持回滚吗?

    1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作red ...

  7. 【Redis】Redis安装、应用场景、数据类型、配置文件(很全)、发布订阅、事务、分布式锁、持久化、主从复制、集群等

    文章目录 Redis笔记 Redis 介绍 应用场景 相关技术 安装 Redis 操作及数据类型 Redis 键操作(Key) Redis 字符串(String) Redis 列表(List) Red ...

  8. 【带你重拾Redis】Redis常见知识点

    什么是Redis? Redis是一个使用ANSI C语言编写,遵守BSD协议规范的开源的K-V类型的NoSQL数据库服务器. Redis是当前最流行的K-V类型的NoSQL数据库之一,在通往系统架构的 ...

  9. redis安装 redis命令 php如何使用redis

    php操作redis详解 1.面试题:什么是redis? 答:Redis是一种开源的使用ANSI C语言编写,支持网络,可基于内存,可持久化的日志型的高性能key-value数据库. 2.写出redi ...

  10. 跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了(总结了一张思维图)...

    前言 秋高气爽的一天,那时候年轻帅气的我正在参照着搜索引擎写代码,迷之微笑般的敲着键盘(又从搜索引擎上找到代码案例啦),突然领导在小隔间里传来了呼唤声,然后有了以下场景: 领导:小Z,你过来一下: 当 ...

最新文章

  1. 变声原理:卷积和传递函数
  2. python环境配置,windows系统,anaconda集成开发环境
  3. python 闭包中的匿名函数详解!
  4. C语言---输出三角形字符阵列
  5. Sunday算法模板
  6. GRUB系统引导器恢复
  7. 操作系统学习笔记:文件管理
  8. TensorFlow优化模型之正则化
  9. GitHub仓库实现CICD快乐的总结嘤嘤嘤
  10. 2020年12月程序员工资新出炉,和你相差多少?
  11. springboot引入validation
  12. 老徐和阿珍的故事:强引用、软引用、弱引用、虚引用,傻傻分不清楚
  13. 宽高不定div水平、垂直居中
  14. 彩色图像高频与低频成分的分解
  15. 应用计算机散热的原理是什么,笔记本电脑散热原理与CPU降频技术解析
  16. nginx匹配多个路径转发到同一个地址写法
  17. 科技将把我们带向哪里
  18. 洛谷 小木棍(暴力+剪剪剪剪枝)
  19. 专业能力一般的应届本科生,该如何准备面试
  20. RabbitMQ配置之mandatory,publisher-returns相关

热门文章

  1. pdo-mysql_PHP: MySQL (PDO) - Manual
  2. cdn节点人少延迟高_让你刷剧一直爽,CDN原理是什么
  3. 朵朵糖故事机器人怎么更新_“故事贩卖机”专栏创始人温酒的新作,奇幻世界的暖心物语很治愈...
  4. c#中索引器是什么_C#中的索引器
  5. Java PriorityQueue poll()方法与示例
  6. mysql gtid配置_mysql 5.7 GTID主从配置
  7. ruby宝石区块链最新消息_Ruby宝石| Ruby工具
  8. 如何设计不宕机的 Redis 高可用服务?
  9. 消息队列的其他实现方式
  10. Redis 键值过期操作