Redis 事务介绍

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

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

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

  • 开始事务。
  • 命令入队。
  • 执行事务。

实例

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

 127.0.0.1:> MULTI
OK
127.0.0.1:> SET book-name "Mastering C++ in 21 days"
QUEUED
127.0.0.1:> GET book-name
QUEUED
127.0.0.1:> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
127.0.0.1:> SMEMBERS tag
QUEUED
127.0.0.1:> EXEC
) OK
) "Mastering C++ in 21 days"
) (integer)
) ) "Mastering Series"
) "Programming"
) "C++"

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

  事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败(类似于java的1/0的运行时异常)不会导致前面已做指令的回滚,也不会造成后续的指令不做。

  这是官网上的说明 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.

  比如:

 127.0.0.1:> multi
OK
127.0.0.1:> set a aaa
QUEUED
127.0.0.1:> incr a
QUEUED
127.0.0.1:> set b bbb
QUEUED
127.0.0.1:> exec
) OK
) (error) ERR value is not an integer or out of range
) OK
127.0.0.1:> get a
"aaa"
127.0.0.1:> get b
"bbb"

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

  b、若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行

 127.0.0.1:> multi
OK
127.0.0.1:> set a aaa
QUEUED
127.0.0.1:> sett b bbb
(error) ERR unknown command `sett`, with args beginning with: `b`, `bbb`,
127.0.0.1:> set c ccc
QUEUED
127.0.0.1:> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:> get a
(nil)

Redis 事务命令

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

    语法:DISCARD

 redis 127.0.0.1:> MULTI
OK
redis 127.0.0.1:> PING
QUEUED
redis 127.0.0.1:> SET greeting "hello"
QUEUED
redis 127.0.0.1:> DISCARD
OK

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

    语法:Exec

    用法如上实例

  3、Redis Multi 命令用于标记一个事务块的开始。

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

    语法:Multi

    用法如上实例

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

    语法:UNWATCH

 127.0.0.1:> WATCH lock lock_times
OK
127.0.0.1:> UNWATCH
OK

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

    语法:WATCH key [key ...]

 127.0.0.1:> WATCH lock lock_times
OK

【Redis】Redis 事务的更多相关文章

  1. Redis的事务

    Redis对事务的支持是部分支持,不想oracle,要么都成功要么都失败,Redis可以部分成功部分失败 1 是什么: 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺 ...

  2. Redis笔记(五)Redis的事务

    >>关系型数据库的事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. Atomic(原子性): 一个事务(transaction)中的 ...

  3. redis的事务(简单介绍)

    1.简单描述 redis对事务的支持目前还是比较简单.redis只能保证一个client发起的事务中的命令是可以连续的执行,而中间不会插入其他client的命令.由于redis是但现场来处理所有cli ...

  4. Redis的事务功能详解

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

  5. Redis的事务和watch

    redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...

  6. spring中jedis对redis的事务使用注意总结

    spring的@Transactional不支持redis的事务,并且redis的事务和其它关系型数据库的事务概念不是太一样,redis事务不支持回滚,并且一条命令出错后,后面的命令还会执行. 所以不 ...

  7. Redis保证事务一致性,以及常用的数据结构

    reids命令可以参考中文官网:http://redis.cn/commands.html 关于reids的使用,可以封装到工具类进行调用: Redis的工具类:JedisAdapter 除了数据结构 ...

  8. Redis(十一):Redis的事务功能详解

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

  9. 第四章· Redis的事务、锁及管理命令

    一.事务介绍 二.Redis乐观锁介绍 三.Redis管理命令 一.事务介绍 Redis的事务与关系型数据库中的事务区别 1)在MySQL中讲过的事务,具有A.C.I.D四个特性 Atomic(原子性 ...

  10. $Django python中使用redis, django中使用(封装了),redis开启事务(管道)

    一 Python操作Redis之普通连接 #先安装 pip3 install redis import redis r = redis.Redis(host='127.0.0.1', port=637 ...

随机推荐

  1. 关于缩短cin时间的方法

    std::ios::sync_with_stdio(false);

  2. 使用flask搭建微信公众号:接收与回复消息

    token验证的意义 在看了别人的代码之后对token加密有了些理解了.但又觉得很鸡肋.第一次验证服务器的时候我在那弄了半天的验证其实不写也可以验证成功,只要直接返回echostr这个字段就行了.微信 ...

  3. jmeter脚本中请求参数获取的几种方式

     a.从数据库获取: 譬如接口请求参数中id的值,我需要从数据库获取,如下设置: 先设置jdbc connection configuration,然后设置JDBC b.从CSV获取: 获取CSV文件 ...

  4. 项目Beta冲刺 - 凡事预则立

    课程: 软件工程1916|W(福州大学) 作业要求: 项目Beta冲刺 团队名称: 火鸡堂 作业目标: 尽力交付 火鸡堂 队员学号 队员姓名 博客地址 备注 221600111 彼术向 http:// ...

  5. vue之组件通信

    vue组件通信一般分为以下几种情况: 1.父子组件通信: 2.兄弟组件通信: 3.跨多层级组件通信: 一.父子通信        父组件通过props传递数据给子组件,子组件通过emit发送事件传递数 ...

  6. 关于我&声明

    声明 本站内容仅作记录,严禁私人用于参考用药或诊断!请遵循医嘱. 访问本站请确保您有一定的医学知识,本人不对任何个人或团体因参考本站文章负法律责任! 关于 医学生,资深玩家. Logo [ Logo ...

  7. 手写队列以及stl中队列的使用

    一,手写队列. struct queue { ; ,rear=,a[maxn]; void push(int x) { a[++rear]=x; } void pop() { first++; } i ...

  8. pgloader 学习(七) 从归档文件加载数据

    我们可以直接从zip,tar,gzip 文件获取内容 command file 参考格式 LOAD ARCHIVE FROM /Users/dim/Downloads/GeoLiteCity-late ...

  9. 回文数 js 解法

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  10. 1、kafka概述

    一.关于消息队列 消息队列是一种应用间的通信方式,消息就是是指在应用之间传送的数据,它也是进程通信的一种重要的方式. 1.消息队列的基本架构 producer:消息生产者. broker:消息处理中心 ...