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

OK127.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>exec1) 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事务java_Redis之Redis的事务相关推荐

  1. Redis 高级特性(1)—— 事务 过期时间 排序

    1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...

  2. 每秒1w+分布式事务--dtm的Redis存储性能测试分析

    概述 之前dtm给出了Mysql作为存储引擎的性能测试报告,在一个普通配置的机器上,2.68w IOPS,4核8G机器上,能够支持大约每秒900+分布式事务,能够满足大部分公司的业务需求. 此次带来的 ...

  3. redis多服务器共享_【数据库】Redis(二)持久化及事务

    Redis的数据持久化 Redis是基于内存对数据操作的数据库,计算机重启后,内存中的数据就会丢失,所以redis提供了持久化的功能,可以将redis操作的内存中数据持久化到本地的硬盘中.在redis ...

  4. 事务例子_Redis事务系列之一Redis事务详解

    一.前言 本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容: redis 事务 redis乐观锁讲解 redis乐观锁实现秒杀 我们一步一步来,本章主要讲解事务. 二.事务 2. ...

  5. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  6. Redis:17---常用功能之(事务)

    为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题,本文介绍Redis事务,Lua在下一篇文章介绍 一.事务概述 简单地说,事务表示一组动作,要么全部执行,要 ...

  7. python redis事务_python实现redis三种cas事务操作

    cas全称是compare and set,是一种典型的事务操作. 简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性. 一般数据库,比如MySql是如何保证 ...

  8. Redis系列:Redis持久化机制与Redis事务

    Redis 是个基于内存的数据库.那服务一旦宕机,内存中数据必将全部丢失.所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作 ...

  9. Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|

    文章目录 Redis ! 一.概述 二.安装 三.实操 1.性能测试 2.基础知识 3.基本key命令 4.基本数据类型 1.String 2.List 3.Set 4.Hash 5.Zset 5.特 ...

最新文章

  1. phaiapi数据库重写类
  2. VS2010打开项目提示未能正确加载解决方案中一个或多个项目
  3. 禁止套娃!Redis官网宕机,返回“连接不上Redis”
  4. 计算机猜数游戏matlab,MATLAB课程设计报告猜数游戏设计
  5. SAP Spartacus API 的事务处理特性
  6. SAP Spartacus 如何借助env-cmd 实现 B2B 和 B2C 功能启动的无缝切换
  7. 如何配置CentOS或者RedHat5.X、6.X、7.X的网络yum源
  8. 1005. K 次取反后最大化的数组和(javascript)
  9. Mozilla 修复跨平台加密库 NSS 中的严重漏洞
  10. Mac如何设置intellij idea中文
  11. python箱线图代码找出异常_matplotlib中的箱线图:标记和异常值
  12. VEH Hook 及 检测
  13. Sql Server Report Builder 计算标准偏差
  14. 【C盘内存不足的解决方法】
  15. 【论文精读1】CSDI: Conditional Score-based Diffusion Models for Probabilistic Time Series Imputation
  16. @TableField fill
  17. 粉象生活优惠券项目优势
  18. IDEA 中 使用 git 进行上传和下载项目
  19. [BLE]低功耗蓝牙介绍
  20. UE4蓝图流程控制:FlipFlop节点、DoOnce节点的使用

热门文章

  1. 知道2020年计算机二级考试成绩,2020年9月计算机二级考试成绩可以查了 多少分及格...
  2. java数组可以包含对象吗_数组可以包含对象类型的元素吗_对象数组
  3. 实战——幂等性+海量数据处理
  4. Linux下打包命令tar
  5. 禅道怎么启动mysql_禅道启动mysql报错connectByPDO
  6. java连接数据库,jdbc四要素,jdbc六大步
  7. 恒烁M0+系列CX32L003单片机及其GPIO的操作
  8. 【AI公司酷05期】美宅科技:独创人工智能室内设计引擎,帮你3秒搞定装修方案,要用AI赋能家居新零售
  9. python字典元素由什么组成_【】Python中,字典、列表、元组分别用 、 、 作定界符,字典的每个元素由两部分组成,分别是 和 ,其中 不允许重复。...
  10. 正大国际期货:若想期货交易持续盈利务必牢记333仓位控制法