PHP使用Redis的Transaction(事务)命令-阿里云开发者社区

开发者社区> 再现理想> 正文

PHP使用Redis的Transaction(事务)命令

简介: 本篇笔记简单介绍了Redis的Transaction(事务)命令:discard,exec,multi,unwatch,watch作用和php的使用
+关注继续查看

1.Transaction命令

命令 作用 返回值
watch 监视一个或多个key 总是OK
multi 声明事务开始,后续命令将排队按顺序等待exec执行 总是OK
exec 顺序执行multi之后的命令,如果multi之前使用watch命令监视的键的值发生变化,执行将失败 执行成功时返回数组包含每个命令执行结果,失败时原生命令返回null,php-redis扩展方法返回false
discard 取消事务 总是OK
unwatch 取消watch监视,如果watch监视之后执行了exec或discard,会自动取消监视,不必再unwatch 总是OK

2.执行事务

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/24
 * Time: 21:03
 */
try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    //开启事务
    $redis->multi();
    $redis->setex('keyTest', 60, 1);
    $redis->get('keyTest');
    $redis->incr('keyTest');
    $redis->get('keyTest');
    //执行事务
    $ret = $redis->exec();
    print_r($ret);
} catch (Exception $e){
    echo $e->getMessage();
}

执行结果:以数组形式返回了每个命令执行结果

Array
(
    [0] => 1
    [1] => 1
    [2] => 2
    [3] => 2
)

3.取消事务

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/24
 * Time: 21:03
 */
try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    //先设置缓存keyTest为1
    $redis->setex('keyTest', 60, 1);
    //开启事务
    $redis->multi();
    $redis->setex('keyTest', 60, 10);
    $redis->get('keyTest');
    $redis->incr('keyTest');
    $redis->get('keyTest');
    //取消事务
    $redis->discard();
    $ret = $redis->get('keyTest');
    var_dump($ret);
    //查看keyTest
} catch (Exception $e){
    echo $e->getMessage();
}

执行结果:keyTest还是原值,并未发生变化

string(1) "1"

4.监视键,并执行事务

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/24
 * Time: 21:03
 */
try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    //先设置缓存keyTest为1
    $redis->setex('keyTest', 60, 1);
    //监视keyTest
    $redis->watch(array('keyTest'));
    //假设在开始监视之后,执行事务之前,keyTest被并发操作redis的其他用户修改了
    $redis->setex('keyTest', 60, 10);
    //开启事务
    $redis->multi();
    $redis->incr('keyTest');
    //执行事务
    $ret = $redis->exec();
    var_dump($ret);
    $ret = $redis->get('keyTest');
    var_dump($ret);
    //查看keyTest
} catch (Exception $e){
    echo $e->getMessage();
}

执行结果:exec返回false

bool(false)
string(2) "10"

Transaction(事务)命令的关键在于,redis在给我们提供了高性能的同时,虽然命令是原子性的,但无法和我们的php产生上下文关联,这个时候,Transaction(事务)命令就派上了用场
原文地址:https://www.jmsite.cn/blog-601.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
php使用gd库将文字转换成图片(转)
GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。   [php] view plain copy       运行结果:  如何联系我:【万里虎】www.
1214 0
艾伟:[一步一步MVC]第一回:使用ActionSelector控制Action的选择
本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时“...
684 0
用PHP轻松完成一个分布式事务TCC,保姆级教程
什么是TCC,TCC是Try、Confirm、Cancel三个词语的缩写,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。
48 0
Spring 5 中文解析数据存储篇-事务同步和声明式事物管理
本章节主要描述:Spring 5 中文解析数据存储篇-事务同步和声明式事物管理。
650 0
spring事物配置,声明式事务管理和基于@Transactional注解的使用
spring事物配置,声明式事务管理和基于@Transactional注解的使用 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性。 spring支持编程式事务管理和声明式事务管理两种方式。
1440 0
Redis事务:用法,常见错误和API
Redis事务:用法,常见错误和API
2180 0
如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化
{System.InvalidOperationException: 如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
1859 0
PHP 使用 OSS上传文件
PHP 使用 OSS上传文件
2876 0
Spring Boot 多数据源,整合 Atomikos 实现分布式事务
最近的项目需要整合两个数据库,有些业务逻辑也涉及到两个数据库同时插入、更新的操作;所以就涉及到跨数据库的数据一致性问题。于是基于 `Spring Boot` 整合了 `Atomikos` 的一个项目 demo。
2073 0
+关注
再现理想
学习-永无止境
18
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载