Redis高级篇

  • 事务


MULTI, EXEC, DISCARD and WATCH命令用于保证Redis中的事务处理

一个事务中的所有命令被序列化并串行执行。

事务的原子性。

用法

MULTI 进入一个事务,这个命令响应“OK”。

EXEC开始执行事务中的命令。

DISCARD将退出事务。

> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

事务错误处理

事务执行可能出现两种错误:

  • 在EXEC执行前,命令不能正常添加到Queue中。例如,命令出现语法错误等。
  • 在EXEC执行后,例如在string类型上进行list操作。

针对于第一种错误,Client通常能看到,在执行命令后响应为“QUEUED”说明成功,否则失败。

为什么Redis不支持事务回滚

如果你有使用过关系式数据库的经验,那么“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪 。

原因如下:

  • Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
  • 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

有种观点认为 Redis 处理事务的做法会产生 bug ,然而需要注意的是,在通常情况下,回滚并不能解决编程错误带来的问题。举个例子,如果你本来想通过INCR 命令将键的值加上 1 ,却不小心加上了 2 ,又或者对错误类型的键执行了INCR,回滚是没有办法处理这些情况的鉴于没有任何机制能避免程序员自己造成的错误,并且这类错误通常不会在生产环境中出现,所以 Redis 选择了更简单、更快速的无回滚方式来处理事务

Discarding the command queue

DISCARD用来中止事务。

> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"

用check-and-set(CAS)优化锁

WATCH命令用来监控更新事务的状态。。

WATCH 关键字用来监控为了keys的变化。在EXEC执行前,如果监控中的任一key发生变化,那么事务将会停止,并且EXEC将返回空表示事务失败。例如,我们需要使key自增1(假设Redis没有INCR),做法如下:

val = GET mykey
val = val + 1
SET mykey $val

这种做法对于单个client没有问题,可是对于多个client同时进行操作的话,那么就有问题了。通过WATCH命令我们就能很好地解决这个问题:

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

上面的代码中,如果其它client修改了WATCH和EXEC之间的变量val,那么事务将会失败。

WATCH

WATCH可理解为有条件的EXEC命令,也就是说如果要执行事务,那么必须是WATCHed的keys都没有被其它client修改过,否则事务不执行。

WATCH能被多次调用。

使用UNWATCH(无参数)命令移除不需要监控的keys。

使用WATCH实现ZPOP命令(原子型操作:从集合中移除score最低的元素)的功能

WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC

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

  1. Redis事务管理

    用过其他关系型数据库(比如msql)的肯定都指定,在关系型数据库里面的事务可以保证多个命令操作要么同时成功,要么同时失败.并且在执行事务的时候,可以有隔离级别. 但是在Redis中的事务,只是保证事务 ...

  2. Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现

    回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...

  3. Redis学习——Redis事务

    Redis和传统的关系型数据库一样,因为具有持久化的功能,所以也有事务的功能! 有关事务相关的概念和介绍,这里就不做介绍. 在学习Redis的事务之前,首先抛出一个面试的问题. 面试官:请问Redis ...

  4. redis的持久化 与事务管理

    1. redis的持久化 Redis的持久化主要分为两部分:RDB(Redis DataBase), AOF(Append Only File) 2. 什么是redis 的持久化        在指定 ...

  5. Redis整理第三波(生存时间、事务管理)

    expire  设置生存时间 Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即到期后数据销毁. TTL查看key的剩余时间,当返回值为-2时,表示键被删除. 当 ...

  6. Redis数据库之KEY的操作与事务管理

    目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...

  7. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

  8. 聊一聊Redis事务

    没错,Redis也有事务管理,但是功能很简单,在正式开发中也并不推荐使用.但是面试中有可能会问到,所以本文简单谈一谈Redis的事务. 通过这篇文章,你会了解 Redis为什么要提供事务? Redis ...

  9. [转]Spring的事务管理难点剖析(1):DAO和事务管理的牵绊

    原文地址:http://stamen.iteye.com/blog/1441758 有些人很少使用Spring而不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用S ...

随机推荐

  1. java多态与异常处理——动手动脑

    编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论. 要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都 ...

  2. IntPtr

    一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型.这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄.它是一个平台特定类型.对于它的解释,这个哥们写的比较 ...

  3. 在TNSNAMES.ORA文件中配置本机装的oracle

    首先,感谢这两位网友:http://zhidao.baidu.com/link?url=eGYeoEa-EhQdVitSGqjE36uNfVmEsryXH1WUjPue6YvArDSx-Y1N9_rd ...

  4. checkbox复选框样式

    随着现代浏览器的流行,纯CSS设置checkbox也变的很是实用,下面会讲到5种与众不同的checkbox复选框. 首先,需要添加一段CSS隐藏所有的Checkbox复选框,下面我们会改变它的外观.要 ...

  5. SSH开发框架搭建参考

    一, 参考文章: 1, http://blog.csdn.net/communicate_/article/details/8644040 这篇文章讲的还算详尽,但是貌似有一些多余的代码: 2,

  6. Educational Codeforces Round 5 A

    Problem A:http://codeforces.com/contest/616/problem/A A. Comparing Two Long Integers 果然还是我太天真了(长整数比较 ...

  7. jmeter 一个可能引起性能严重下降的断言设置

    在添加断言时一定要注意: 1. 红框部分选择 "响应文本", 2.  要断言的内容越短越好

  8. WebViewJavascriptBridge 原理分析

    WebViewJavascriptBridge 原理分析 网上好多都是在介绍 WebViewJavascriptBridge如何使用,这篇文章就来说说 WebViewJavascriptBridge ...

  9. cocos2d-x3.9 默认是 gnustl_static 配置,但是 这个库缺少c++的基础功能... c++_static 功能全面些

    最近的升级Cocos2d-x 3.2正式版.iOS不管是什么程序编译问题,使用结果cocos compile -p android编译APK计划.结果悲剧,出现以下错误. Android NDK: I ...

  10. C#连接SQLite的字符串

    一.C#在不同情况下连接SQLite字符串格式 1.Basic(基本的) Data Source=filename;Version=3; 2.Using UTF16(使用UTF16编码) Data S ...