首页 > 数据库 >Redis事务

Redis事务

时间:2023-12-28 10:13:37浏览次数:21  
标签:事务 get Redis redis ret echo keyTest

其实redis的事务是个假事务,没有实现原子性,

若要php支持事务,必须一起执行,其中incr会报错

$status =  $redis->multi()->lPush($key1, '1123')->lPush($key2, '2123')->incr("age","age")->exec();
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
)

取消事务

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();
}
//输出
string(1) "1"

监视键,并执行事务

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();
}
//输出 
bool(false)
string(2) "10"

redis抢购

<?php
header("content-type:text/html;charset=utf-8");
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->watch("mywatchlist");
$len = $redis->hlen("mywatchlist");
$rob_total = 100; //抢购数量
if ($len < $rob_total) {
    $redis->multi();
    $redis->hSet("mywatchlist", "user_id_" . mt_rand(1, 999999), time());
    $rob_result = $redis->exec();
    //file_put_contents("log.txt", $len . PHP_EOL, FILE_APPEND);
    if ($rob_result) {
        $mywatchlist = $redis->hGetAll("mywatchlist");
        echo '抢购成功' . PHP_EOL;
        echo '剩余数量:' . ($rob_total - $len - 1) . PHP_EOL;
        echo '用户列表:' . PHP_EOL;
        print_r($mywatchlist);
        exit;
    } else {
        exit('手气不好,再抢购!');
    }
} else {
    exit('已卖光');
}

标签:事务,get,Redis,redis,ret,echo,keyTest
From: https://www.cnblogs.com/qcy-blog/p/17932075.html

相关文章

  • Redis进阶 使用Lua编写Redis脚本
    前面学习了Lua的基本语法,接下来是使用Lua编写脚本1.可以使用redis.call来调用redis命令使用redis.call会将redis命令返回的类型转换成对应的Lua数据类型。关系如下 与redis.call想类似的就是redis.pcall。【redis.call与redis.pcall的区别】当命令出错的时候,redis.pcall......
  • redis主从配置
    先学一个高端linux指令:catredis.conf|grep-v"^#"|grep-v"^$">msconf/redis-master.conf-v反向查找  "^#"以#开头的行   "^$"空行  将redis.conf去掉空行和以#开头的行,写入到msconf文件夹的redis-master.conf文件中 1、master-6380.conf配置文件主要......
  • redis哨兵
    Redis安装1、上传如下图:将redis-5.0.8.tar.gz包上传到目录:/apphome/下  2、解压如下图:解压压缩文件,执行命令:tar-zxvf redis-5.0.8.tar.gz,解压后生成新的文件夹redis-5.0.8  3、编译安装如下图:执行命令:make && make PREFIX=/apphome/redis  install3、......
  • MySQL 事务日志
    MySQL事务日志事务有4种特性:原子性,一致性,隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢(是通过什么来控制的呢)?事务的"隔离性"由锁机制实现(通过加锁来实现隔离)。而事务的"原子性","一致性"和"持久性"由事务的redo日志和undo 日志来保证redolog称......
  • MySQL 事务的基础知识
    事务的基础知识1.数据库事务概述事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库中的数据始终保持一致性,同时我们还能通过事务的机制恢复到某个时间地点的数据,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。1.1存储引擎的支持情况查询当......
  • 后端技术:Redis进行数据缓存的两种方法
    在fastapi项目中Redis进行数据缓存的两种不同的方法的demo第一种方法:通过FastAPI应用状态准备文件:models/redis.py为fastapi的数据库模型文件importosimportaioredisfromaioredisimportRedisasyncdefsys_cache()->Redis:"""系统缓存:return:cac......
  • redisearch入门
    redisearch1.安装docker安装dockerrun-d--nameredisearch-p8379:6379redislabs/redisearch2.验证验证search是否安装dockerexec-itredisearchredis-climodulelist1)1)"name"2)"ReJSON"3)"ver"4)(integer)99......
  • Spring系列:基于Spring-Jdbc实现事务
    目录一、事务基本概念二、编程式事务三、声明式事务前期准备四、基于注解的声明式事务@Transactional注解标识的位置事务属性:只读事务属性:超时事务属性:回滚策略事务属性:隔离级别事务属性:传播行为测试五、基于XML的声明式事务一、事务基本概念①什么是事务数据库事务(transacti......
  • 06-redis的cluster集群
    一、介绍Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为......
  • 07-Redis 多API开发实践
    Redis提供了各类开发语言的API,方便开发语言连接使用Redis。https://redis.io/clients官方网站提供了不同开发语言的API程序。网中,给我们提供了很多种Python连接redis的API,我们通常选择有“笑脸”并且带有“星号”的使用这里我们推荐使用redis-py.redis的多API支持python为......