Redis 事务

事务
用来保证程序原子性的一系列操作
当开启事务后redis会将所有操作记录单不执行
当执行exec时 将之前记录的操作一并执行
redis事务只能保证操作的原子性 但不支持数据回滚
下面例子基于 redis 3.2.10 低于此版本可能会略有不同

// 连接redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 开启事务
$multi = $redis->multi();

if($multi){

    $redis->set('aaa',100);
    $redis->set('bbb',200);

    // 提交事务
    $exec = $redis->exec();

    // 返回一个数组 : Array ( [0] => 1 [1] => 1 )
    // 数组的第一个值为第一个操作 set('aaa',100) 的执行结果 成功为 1  以此类推
    print_r($exec);
}

上面例子会一致性执行 set('aaa',100); 和 set('bbb',200);
如果多个操作中有语法或书写错误 则exec时会全都不执行

$multi = $redis->multi();

    $redis->set('aaa',100);
    $redis->set22('bbb',200);
    $redis->lPush('aaa',2000);

$redis->exec();

# 上面3项操作会全都不执行

那么有一种情况 当事务在执行的过程中 其他客户端又来操作事务中涉及到的值
那么这样就很容易出现数据错乱或脏读的问题
redis 提供了 watch 来监听一个或多个键 如果在事务提交前所监听的键被改变则exec失败

// 连接redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 监听一个或多个键
$res = $redis->watch(array('aaa','bbb'));

// 开启事务
if($res){

    // 开启事务
    $multi = $redis->multi();

    if($multi){

        $redis->set('aaa',1000);
        $redis->set('bbb',2000);

        // 提交事务
        $exec = $redis->exec();

        // 返回一个数组 : Array ( [0] => 1 [1] => 1 )
        // 数组的第一个值为第一个操作 set('aaa',100) 的执行结果 成功为 1  以此类推
        print_r($exec);
    }
}

# 在watch之后 exec之前 其他客户端改变所监听的键的值时( 读取不改变值则不会出发 ) 则当前事务exec则会失败
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • redis事务 Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务...
    全能程序猿阅读 2,191评论 0 11
  • 1. 概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULTI...
    六月星空2011阅读 363评论 0 0
  • 在多个客户端同时处理相同的数据时,不谨慎的操作很容易导致数据出错。一般的关系型数据库中有事务保证了数据操作的原子性...
    rainybowe阅读 3,517评论 0 5
  • 关系型数据库的事务具备:原子性、隔离性、持久性、一致性。在Redis中也同样拥有事务的概念,本文主要介绍Redis...
    yingzong阅读 2,468评论 1 5
  • redis 是一个高性能的key-value 数据库。作为no sql 数据库redis 与传统关系型数据库相比有...
    点融黑帮阅读 2,933评论 1 15