文章目录

  • Redis 事务入门及命令
    • 事务概念
    • Redis 事务概念
    • Redis 事务特性
    • Redis 三个阶段
      • 入门代码示例
    • Redis 相关命令
      • MULTI
      • DISCARD
      • EXEC
      • WATCH
      • UNWATCH

Redis 事务入门及命令

事务概念

数据库事务( transaction )是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

事务必须满足所谓的ACID属性

Redis 事务概念

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

Redis 事务特性

Redis事务的三个特性:

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

  • 没有隔离级别的概念: 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。

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

Redis 三个阶段

Redis的一个事务从开始到执行会经历以下三个阶段:

  • 开始事务:使用 MULTI 开启一个事务
  • 命令入队:当开启一个事务之后,之后所有的命令不会马上被执行,而是会被放入到一个事务队列中,然后返回 QUEUED, 表示命令已入队
  • 执行事务:那么当 EXEC 命令执行时, 服务器根据客户端所保存的事务队列, 以先进先出(FIFO)的方式执行事务队列中的命令:最先入队的命令最先执行,而最后入队的命令最后执行

入门代码示例

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUEDredis 127.0.0.1:6379> GET book-name
QUEUEDredis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUEDredis 127.0.0.1:6379> SMEMBERS tag
QUEUEDredis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"2) "C++"3) "Programming"

结果图如下:

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

这是官网上的说明 From redis docs on transactions:

It’s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

比如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。


Redis 相关命令

下表列出了 redis 事务的相关命令:

命令 说明
MULTI 标记一个事务块的开始。
DISCARD 取消事务,放弃执行事务块内的所有命令。
EXEC 执行所有事务块内的命令。
WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
UNWATCH 取消 WATCH 命令对所有 key 的监视。

MULTI

Redis Multi 命令用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

返回值:

  • 总是返回 OK

代码示例:

redis 127.0.0.1:6379> MULTI            # 标记事务开始
OKredis 127.0.0.1:6379> INCR user_id     # 多条命令按顺序入队
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> PING
QUEUEDredis 127.0.0.1:6379> EXEC             # 执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

DISCARD

Redis Discard 命令用于取消事务,放弃执行事务块内的所有命令。

返回值:

  • 总是返回 OK

代码示例:

redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> PING
QUEUEDredis 127.0.0.1:6379> SET greeting "hello"
QUEUEDredis 127.0.0.1:6379> DISCARD
OK

取消事务之后

我们是查不到事务块里面的操作的,事务块内的所有命令都被放弃执行了

EXEC

Redis Exec 命令用于执行所有事务块内的命令。

返回值:

  • 执行成功,返回事务块内所有命令的返回值,按命令执行的先后顺序排列。

  • 当操作被打断时,返回空值 nil 。

代码示例:

# 事务被成功执行redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> PING
QUEUEDredis 127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG# 监视 key ,且事务成功执行redis 127.0.0.1:6379> WATCH lock lock_times
OKredis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET lock "hazi"
QUEUEDredis 127.0.0.1:6379> INCR lock_times
QUEUEDredis 127.0.0.1:6379> EXEC
1) OK
2) (integer) 1# 监视 key ,且事务被打断redis 127.0.0.1:6379> WATCH lock lock_times
OKredis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET lock "yurug"        # 就在这时,另一个客户端修改了 lock_times 的值
QUEUEDredis 127.0.0.1:6379> INCR lock_times
QUEUEDredis 127.0.0.1:6379> EXEC                  # 因为 lock_times 被修改, joe 的事务执行失败
(nil)

WATCH

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

语法如下:

WATCH key [key ...]

返回值:

  • 总是返回 OK

代码示例:

redis> WATCH lock lock_times
OK

UNWATCH

Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视。

返回值

  • 总是返回 OK

实例

redis 127.0.0.1:6379> WATCH lock lock_times
OKredis 127.0.0.1:6379> UNWATCH
OK

Redis事务入门及命令相关推荐

  1. Redis事务、MULTI 命令和EXEC 命令

    Redis事务 文章目录 Redis事务 事务实例 MULTI 命令 EXEC 命令 事务异常 1. 进入队列之前发生错误 Redis 是没有回滚操作的 Watch 命令 执行 watch 命令,不执 ...

  2. Redis事务,watch命令学习

    redis事务: redis的事务和mysql等关系型数据库的事务不太一样,redis中的事务不会回滚,只能手动收拾事务失败后的烂摊子. 在命令行中,MULTI是事务的开始命令.EXEC是事务的执行命 ...

  3. Redis事务(二)-WATCH命令的实现

    WATCH命令的实现 概述 使用WATCH命令监视数据库键 监视机制的触发 判断事务是否安全 概述 WATCH命令是一个乐观锁(optimistic locking) 它可以在EXEC命令执行之前,监 ...

  4. Redis事务控制|相关命令|队列失败两种情况|官方解释无回滚|悲观锁和乐观锁简单介绍

    相关命令 命令队列执行失败的两种情况 1.执行队列时失败:错误在入队时检测不出来,整个队列执行时有错的命令执行失败,但是其他命令并没有回滚. 加入队列时失败:遇到了入队时即可检测到的错误,整个队列都不 ...

  5. 图解Redis事务机制

    来自:Java中文社群 作为关系型数据库中一项非常重要的基础功能--事务,在 Redis 中是如何处理并使用的? 1.前言 事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只 ...

  6. python redis事务_python redis事务源码及应用分析

    在多个客户端同时处理相同的数据时,不谨慎的操作很容易导致数据出错.一般的关系型数据库中有事务保证了数据操作的原子性,同样Redis中也设置了事务,可以理解为"将多个命令打包,然后一次性.按顺 ...

  7. 面试问到 Redis 事务,我脸都绿了。。

    前言 前几天有读者说自己面试被问到Redis的事务,虽然不常用,但是面试竟然被问到,平时自己没有注意Redis的事务这一块,面试的时候被问到非常不好受. 虽然,这位读者面试最后算是过了,但是薪资方面没 ...

  8. redis事务不具有回滚机制,那么它是如何进行事务控制的

    redis事务 任何数据库都要有一套自己的事务控制机制,redis事务是一次可以执行多个命令,它的本质是一组命令的集合.一个事务中所有的命令都会被序列化,在事务执行的过程中会按照顺序执行队列中的命令. ...

  9. Redis : redis事务

    Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础. Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >R ...

最新文章

  1. 寒假与春节终归,新学期和新任务又至
  2. POJ - 1321 棋盘问题
  3. CENTOS7 修改 网卡名称为eth0的配置方法
  4. 优必选发布新一代大型机器人Walker X
  5. 单片机0 99c语言程序,单片机C语言程序设计实训99例.doc
  6. Hadoop学习整理
  7. yuicompressor java_YUI Compressor使用配置方法 JS/CSS压缩工具
  8. JavaEE之HTML常见标签及个人简历制作
  9. 如何准备全国大学生电子设计大赛控制题?
  10. PSV1000刷黑商
  11. 【无人机系统】四轴飞行器及其UAV飞控系统 - 桂林电子科技大学信息科技学院 电子工程系(一)
  12. The type of the expression must be an array type but it resolved to ListObj
  13. MT【133】磨刀不误砍柴工
  14. boost noncopyable实现与ADL
  15. 如何测试网页的登录页面(转载)
  16. SVN报错:Cannot checkout from svn: svn: E155000: 'F:\SVN-Flx\。。。。' is alrea
  17. 停车还能360全方位影像_路虎(揽胜运动星脉极光发现)车主如何选购360全景安全辅助系统...
  18. ffmpeg 拼接mp4_通过 ffmpeg 无损剪切/拼接视频
  19. 远程无线视频监控知识
  20. zabbix配置钉钉报警

热门文章

  1. Linux进程崩溃排查方法
  2. idea调试常用的快捷键
  3. 1110道Java面试题及答案(最新Java初级面试题大汇总)
  4. 硬盘供电不足引起的系统不正常现象
  5. 计算机报名显示改用户不存在,想从网上预约考试可是上面老是说用户不存在
  6. 五种常用异常值检测方法
  7. python中定义数组的方法
  8. Android SDK的安装配置
  9. win10 C盘突然爆满 清理方法
  10. matlab画韦恩图,用R语言绘制韦恩图