事务能够一次执行多个命令, 而且带有如下三个重要的保证:php
事务从开始到执行会经历如下三个阶段:redis
注意:redis事务不支持回滚数组
10.117.8.188:6379> MULTI OK 10.117.8.188:6379> set string4 'string4' QUEUED 10.117.8.188:6379> set string3 'string3' QUEUED 10.117.8.188:6379> del string QUEUED 10.117.8.188:6379> EXEC 1) OK 2) OK 3) (integer) 1
10.117.8.188:6379> MULTI OK 10.117.8.188:6379> del string4 QUEUED 10.117.8.188:6379> del string3 QUEUED 10.117.8.188:6379> DISCARD OK
客户端2: set string1 '1111' OK 客户端1: 10.117.8.188:6379> WATCH string1 OK 10.117.8.188:6379> MULTI OK 10.117.8.188:6379> set string1 'string1' QUEUED 10.117.8.188:6379> set string3 'val3' QUEUED 10.117.8.188:6379> EXEC (nil) 因为string1的值发生变化,事务被打断,返回nil;
10.117.8.188:6379> UNWATCH OK
命令可能在EXEC调用以后失败,此时事务中的错误不会被处理,事务会继续往下执行code
$redis->multi(); //$redis->pipeline(); $redis->set('string1','kkk12'); $redis->set('string2','kooo2'); $redis->get('string1'); $res = $redis->exec(); var_dump($res); //返回值: array(3) { [0]=> bool(true) [1]=> bool(true) [2]=> string(5) "kkk12" } // 事务被取消 $redis->multi(); $redis->set('string1','k234'); $redis->set('string2','kooo2'); $redis->get('string1'); $res = $redis->discard(); var_dump($res); //返回值: bool(true)
第一段代码: $redis->watch('string1'); $redis->multi(); $redis->set('string1','k234'); $redis->set('string2','kooo2'); $redis->get('string1'); sleep(10); $ret = $redis->exec(); var_dump($ret); 第二段代码: $redis->connect('10.117.8.188',6379); $res = $redis->set('string1','llll1'); var_dump($res); //true 第一段代码exec未执行以前,执行第二段代码,等待第一段代码执行结束,打印$ret:false