【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 ...
随机推荐
- composer 更新国内镜像地址
composer config -g repo.packagist composer https://packagist.phpcomposer.com
- 【Flask】SelectedField 同步数据库
## 如果不加入__init__函数会导致,SelectedField表单生成只有里面的内容不会和数据库同步(即数据库添加,删除字段时表单中数据项和初始化时一致.下一次重启app是才会同步) clas ...
- 20145229实验三实验报告——敏捷开发与XP实践
20145229实验三实验报告--敏捷开发与XP实践 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 ** 实验步骤**### 敏捷开发与XP 软件工程包括下列领域:软件需求 ...
- java try中包含return语句,finally中的return语句返回顺序
//结论: finally 中的代码比 return 和 break 语句后执行 public static void main(String[] args) { int x=new Test.tes ...
- linux命令学习笔记(10):cat 命令
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示, 或者从标准输入读取内容并显示,它常与重定向符号配合使用. .命令格式: cat [选项] [文件] ...
- 【遍历二叉树】08判断两个二叉树是否相同【Same Tree】
迭代版本用的是二叉树的DFS,中的root->right->left +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- P1030 求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- [转]PNG8和PNG24的区别
首先我们要知道: 1.png8和png24的根本区别,不是颜色位的区别,而是存储方式不同. 2.png8有1位的布尔透明通道(要么完全透明,要么完全不透明),png24则有8位(256阶)的布尔透明通 ...
- github 在线 创建文件夹
参考: http://webapps.stackexchange.com/questions/36411/create-a-folder-in-github-via-the-web-interface
- unittest ,ddt数据驱动,读取文件中数据,多个参数时的处理
1. test.yaml中的数据 这里的属性是list 2.创建用例 3,在yaml中创建数据,创建list数据,list中再创建dict数据,这样就可以读取dict中的多个参数的数据了