redis 事务处理

redis对事务的处理目前还非常简单,Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令,当一个client在一个连接中发出multi命令的时候,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序执行队列中的所有命令。

multi 标记一个事务块的开始。

set name zhangdh

set age 30

exec  提交

multi

incr age

incr name

exec 第一个执行成功,第二个会报错。

这也是redis事务需要改进的地方。

discard 回滚,取消事务,放弃执行事务块里面的所有命令。清空事务的命令队列,并退出事务上下文。

在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能。假设我们通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。例如,我们再次假设Redis中并未提供incr命令来完成键值的原子性递增,如果要实现该功能,我们只能自行编写相应的代码。其伪码如下:

val = GET mykey

val = val + 1

SET mykey $val

以上代码只有在单连接的情况下才可以保证执行结果是正确的,因为如果在同一时刻有多个客户端在同时执行该段代码,那么就会出现多线程程序中经常出现的一种错误场景--竞态争用(race condition)。比如,客户端A和B都在同一时刻读取了mykey的原有值,假设该值为10,此后两个客户端又均将该值加一后set回Redis服务器,这样就会导致mykey的结果为11,而不是我们认为的12。为了解决类似的问题,我们需要借助WATCH命令的帮助,见如下代码:

WATCH mykey

val = GET mykey

val = val + 1

MULTI

SET mykey $val

EXEC

和此前代码不同的是,新代码在获取mykey的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的mykey的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。这样调用者在判断返回值后就可以获悉val是否被重新设置成功。

watch name

set name zjz

multi

set name zby

exec 此事务会失败。输出name值为zjz

时间: 2024-08-26 19:32:24

redis 事务处理的相关文章

redis事务处理

当前使用的redis版本 #redis-cli -v redis-cli 2.6.4 MULTI .EXEC .DISCARD 和WATCH 是 Redis 事务的基础 1.MULTI  命令用于开启一个事务,它总是返回 OK . MULTI 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中 2.EXEC 命令被调用时,所有队列中的命令才会被执行. +++++++++++命令 +++++++++++ redis 192.168.1.53:6379>

四. Redis事务处理

Redis目前对事务的支持还是比较简单,Redis能保证一个Client发起的事务中的命令可以连续执行,而中间不会插入其他Client的命令:当一个Client在连接中发起一个multi命令的时候,这个连接会进入事务上下文,而连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令的时候,redis会顺序的执行该队列中的所有命令. Redis事务涉及的命令关键字:MULTI 进入一个事务上下文,EXEC 执行事务 ,DISCARD 回滚事务 , Watch 事务乐观锁 在SQLSer

Redis使用详细教程

原文:http://www.cnblogs.com/wangyuyu/p/3786236.html 视频教程: http://edu.csdn.net/course/detail/2126/33342?auto_start=1 ---------------------------------------------------------------------------------------------- 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 ***

redis 基础

一 redis数据类型redis支持5种类型的数据类型,它描述如下的:1. 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限.2. 哈希 Redis的哈希是键值对的集合. Redis的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象.3. 列表 Redis的列表是简单的字符串列表,排序插入顺序.您可以添加元素到Redis的列表的头部或尾部. 列表的最大长度为 232 - 1

纯手工整理Redis详细教程

Linux中的Redis缓存服务器 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1.取最新N个数据的操作 2.排行榜应用,取TOP N 操作 3.需要精确设定过期时间的应用 4.计数器应用 5.Uniq操作,获取某段时间所有数据排重值 6.实时系统,反垃圾系统7.Pub/Sub构建实时消息系统 7.Pub/Sub构建实时消息系统8.构建队列系统 9.缓存 ============

初学者必须掌握的redis 基础

这篇文章总结了常用的redis基础知识,希望初学者能够从中受益. 一 redis数据类型 redis支持5种类型的数据类型,它描述如下的: 1. 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限. 2. 哈希 Redis的哈希是键值对的集合. Redis的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象. 3. 列表 Redis的列表是简单的字符串列表,排序插入顺序.您可以添

Redis基础

Redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用于持久性. 相比许多键值数据存储,Redis拥有一套较为丰富的数据类型. Redis可以将数据复制到任意数量的从服务器. Redis 优势 异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录. 支持丰富的数据类型:

[转载] redis入门

原文: http://www.gamecbg.com/bc/db/redis/13852.html [本教程目录] 1.Redis是什么2.Redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis数据结构 – strings9.redis数据结构 – lists10.redis数据结构 – 集合11.redis数据结构 – 有序集合12.redis数据结构 – 哈希13.聊聊redis持久化

超强、超详细Redis数据库入门教程

这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis数据结构 – strings9.redis数据结构 – lists10.redis数据结构 – 集合11.redis数据结构 – 有序集合12.redis数据结构 – 哈希13.聊聊