redis学习(五)事务

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

1、事务基本命令:

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

exec:执行所有事务块内的命令

discard:取消事务,放弃执行事务块内的所有命令

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

unwatch:取消 WATCH 命令对所有 key 的监视。

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set k1 v1
QUEUED
redis 127.0.0.1:6379> set k2 v2
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> set k1 v11
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) OK
3) "v1"
4) OK
5) "v11"
redis 127.0.0.1:6379>

2、错误的处理

之所以说部分支持事务,是因为redis对事务中语法错误和运行中错误的处理不同。

语法时错误:对事务中的所有命令都不执行

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set k1 v1
QUEUED
redis 127.0.0.1:6379> sd dfsdwwe
(error) ERR unknown command ‘sd‘
redis 127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
redis 127.0.0.1:6379>

运行时错误:会忽略错误的命令,其他命令会继续执行

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> SADD num 1 2 3
QUEUED
redis 127.0.0.1:6379> set k1 v1
QUEUED
redis 127.0.0.1:6379> get num
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> EXEC
1) (integer) 3
2) OK
3) (error) ERR Operation against a key holding the wrong kind of value
4) "v1"
redis 127.0.0.1:6379>

3、乐观锁

乐观锁意思就是乐观的认为不同的客户端,大部分情况下,客户端会访问不同的健,不太可能会冲突。只有在冲突的情况下,Redis使用WATCH命令实现事务的“检查再设置”(CAS)行为。

作为WATCH命令的参数的键会受到Redis的监控,Redis能够检测到它们的变化。在执行EXEC命令之前,如果Redis检测到至少有一个键被修改了,那么整个事务便会中止运行,然后EXEC命令会返回一个Null值,提醒用户事务运行失败。

如:使用watch对健k1进行监控,设置k1的值为v1,然后进入事务,事务中设置k1的值为v2,然后执行EXEC运行事务,最后使用get查看k1的值,可以看到k1的值没有改变,说明事务中的命令根本没有执行(因为WATCH监控mykey的过程中,k1被修改了,所以随后的事务便会被取消)

redis 127.0.0.1:6379> WATCH k1
OK
redis 127.0.0.1:6379> set k1 v1
OK
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> SET k1 v2
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> EXEC
(nil)
redis 127.0.0.1:6379> get k1
"v1"
redis 127.0.0.1:6379>

可以使用unwatch k1,来取消对k1的监控。

时间: 2024-10-19 12:20:15

redis学习(五)事务的相关文章

redis学习(5) - 事务

1.redis中的事务是一组命令的集合.一个事务中的命令,要么都执行,要么都不执行 2. MULTI    告诉redis:下面我发给你的命令属于同一个事务,先不要执行,而是把它们暂时存起来 OK SADD "user:1:followers" 2   发送命令 QUEUED                返回QUEUED表示这两条命令已经进入等待执行的事务队列中了 SADD "user:2:followers" 1 QUEUED EXEC            

Redis学习手册(事务)

概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据库开发经验的开发者而言这一概念并不陌生,即便如此,我们还是会简要的列出Redis中事务的实现特征: 1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行. 2). 和关系型数据库中的事务相比,在Redis

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

Oracle Prc C学习 五 事务

这个事务刚开始的时候我很不理解, 我以为是这个事务是一种结构,或者是一个package或者一个procedure, 后来我觉得我想明白点了,其实这个事务只是一件我要完成的事,这件事我不然就完成,要不然就没完成,没完成就回到开始 的状态,或者回到一个你设定的状态那. 如果在程序中就是一个SQL语句开始了,就开始了一个事务,当你觉得这个事务完成了,就调用COMMIT,这就是完成了 一个事务了,当然了,也可以用ROLLBACK,就是回滚这个事务做的事.也就当这个事务完成了,这个完成就是失败的完成 应该

Spring基础学习(五)&mdash;事务管理

一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视为错误,所有从起始点以后的操作应全部回退到开始状态.      事务的操作: 先定义开始一个事务,然后对数据做修改操作,这时如果提交(commit),这些数据就永久的保存下来,如果回退(rollback),数据库管理系统就放弃所有的修改而回到开始事务的状态.   2.事务的属性 (1)原子性(Atm

Redis学习手册(目录)

Posted on 2012-04-16 07:40 Stephen_Liu 阅读(29155) 评论(25) 编辑 收藏 为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后就是上手容易,操作简单.记得在刚刚接触Redis的时候,由于当时项目的工期相当紧张,留给我们做出选择的空间也是非常有限,一旦技术决策失误,造成的后果也比较严重.所以在做出决定之

Redis学习手册

为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后就是上手容易,操作简单.记得在刚刚接触Redis的时候,由于当时项目的工期相当紧张,留给我们做出选择的空间也是非常有限,一旦技术决策失误,造成的后果也比较严重.所以在做出决定之前,我不仅快速的浏览了Redis官网文档,而且还熬夜搜集了很多网上的相关技术文章.在经过一通折腾之后,毅然决然的选择了它,现

Redis学习手册——转载

转载出处:http://www.cnblogs.com/stephen-liu74/archive/2012/04/16/2370212.html 为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后就是上手容易,操作简单.记得在刚刚接触Redis的时候,由于当时项目的工期相当紧张,留给我们做出选择的空间也是非常有限,一旦技术决策失误,造成的后果也比

redis学习教程五《管道、分区》

redis学习教程五<管道.分区> 一:管道 Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 管道的意义 管道的基本含义是,客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复. 示例 要检查Redis管道,只需启动Redis实例,并在终端中键入以下命令. (echo -en "PING\r\n SET t

redis学习教程三《发送订阅、事务、连接》

redis学习教程三<发送订阅.事务.连接> 一:发送订阅      Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息.传送消息的链路称为信道. 示例 以下示例说明了发布用户概念的工作原理. 在以下示例中,一个客户端订阅名为"redisChat"的信道. redis 127.0.0.1:6