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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 本篇笔记简单介绍了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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
NoSQL Redis 数据库
Redis的全局命令及相关误区
Redis的全局命令及相关误区
22 0
|
23天前
|
NoSQL Redis 数据库
什么是Redis的事务?
Redis事务提供原子性和顺序性,确保命令按顺序执行且不被打断。核心概念包括原子性、顺序性、隔离性和持久性。关键指令有MULTI、EXEC、DISCARD和WATCH,用于事务的开始、执行、取消和监视。这保障了命令的完整性,防止并发操作导致的数据不一致。
12 2
|
24天前
|
NoSQL Redis 数据库
Redis中的常用命令有哪些?
Redis常用命令包括:PING测试连接,ECHO回显,SELECT切换数据库,QUIT关闭连接;KEYS查找key,EXISTS检查存在,DEL删除key,EXPIRE设置过期时间,TTL查看剩余生存时间,TYPE检测数据类型;STRING操作如SET/GET/MSET/MGET,INCR/DECR增减计数;HASH命令如HSET/HGET/HMSET/HMGET/HGETALL管理字段;LIST操作如LPUSH/RPUSH/LPOP/RPOP/LRANGE;
10 0
|
30天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
187 0
|
23天前
|
NoSQL Redis
Redis事务:保证数据操作的一致性和可靠性
Redis事务:保证数据操作的一致性和可靠性
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之Hash命令
Redis入门到通关之Hash命令
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之String命令
Redis入门到通关之String命令
|
7天前
|
存储 NoSQL Java
Redis 命令
Redis 命令
144 0
|
17天前
|
NoSQL Linux PHP
php添加redis扩展 linux和windos图文详解 l
php添加redis扩展 linux和windos图文详解 l
3 0
|
18天前
|
NoSQL Redis 数据库
通过migrate命令实现两个redis实例之间的数据迁移
通过migrate命令实现两个redis实例之间的数据迁移