【Redis】Redis事务详解,Redis事务支持回滚(不支持悲观锁)
1、redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc
(php操作redis命令官方大全:https://github.com/phpredis/phpredis)
2、总结:redis事物不支持悲观锁,支持乐观锁,要实现悲观锁,看业务,同时也有下面一种方法,循环 【watch > multi > doRedisCommand > exec】
3、详解:
PHP使用Redis的Transaction(事务)命令
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事务支持回滚(不支持悲观锁)的更多相关文章
- SqlServer事务详解(事务隔离性和隔离级别详解)
概述 不少人对于事务的使用局限于begin transaction:开始事务.commit transaction:提交事务.rollback transaction:回滚事务的初步运用. 并且知道使 ...
- Redis 配置文件 redis.conf 项目详解
Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...
- [转]Reids配置文件redis.conf中文详解
转自: Reids配置文件redis.conf中文详解 redis的各种配置都是在redis.conf文件中进行配置的. 有关其每项配置的中文详细解释如下: 对应的中文版解释redis.conf # ...
- Redis主从复制机制详解
Redis主从复制机制详解 Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文 ...
- Redis快速入门详解
Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...
- redis.conf 配置详解
# Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写) # # 1k => 1000 bytes # 1kb = ...
- Redis学习——详解Redis配置文件(三)
一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...
- [转]Redis内部数据结构详解-sds
本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...
- Redis基础知识详解(非原创)
文章大纲 一.Redis介绍二.Redis安装并设置开机自动启动三.Redis文件结构四.Redis启动方式五.Redis持久化六.Redis配置文件详解七.Redis图形化工具八.Java之Jedi ...
- 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习
反射实现Model修改前后的内容对比 在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...
随机推荐
- 【Flask】查询分页问题处理
遇到两次查询结果分页的问题, 查询出结果后, 翻页时导致查询条件失效. 处理方式 1. 路由中不放page参数 写成 @testfile.route("/test-file", m ...
- castle windsor学习----- Referencing types in XML 在xm文件中引用类型
当从xml引用installer的语法如下 <install type="Acme.Crm.Infrastructure.ServicesInstaller, Acme.Crm.Inf ...
- neutron VPC
The goal of this document is to provide an umbrella blueprint defining how to add support for VPC in ...
- 兼容IE8及其他浏览器的回车事件
//阻止默认浏览器行为 function stopDefault(e) { //如果提供了事件对象,则这是一个非IE浏览器 if(e && e.preventDefault) { // ...
- 模拟C#的事件处理和属性语法糖
1. [代码]SharpEvent.hpp /* * SharpEvent.hpp * * Created on: 2014-5-5 * Author: leoking * Copyr ...
- C++(八)— 死锁原因及解决方法
1.死锁原因 死锁问题被认为是线程/进程间切换消耗系统性能的一种极端情况.在死锁时,线程/进程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是任务永远无法执行完成. 打个比方,假设有 ...
- POJ 3349 Snowflake Snow Snowflakes(哈希表)
题意:判断有没有两朵相同的雪花.每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的.给出n朵,只要有两朵是一样的就输出有Twin snowflakes fou ...
- 验证reg注册表的操作
// wRegKeyclass wRegKey{ // Operationspublic: BOOL Create(HKEY hKeyParent, LPCTSTR lpszKeyName , LPT ...
- SpringBoot_异常_01_Caused by: java.lang.BootstrapMethodError: java.lang.NoSuchMethodError
一.异常信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gsonB ...
- 百度编辑器ueditor的toolbars的各个元素代表的功能说明
百度编辑器ueditor的toolbars的各个元素代表的功能说明