zoukankan      html  css  js  c++  java
  • 使用redis 中的事务处理实现商品秒杀

    redis中的事务处理:

    redis中的事物事物处理是指能够批量的执行一组命令(当事务开始执行时,事务中的命令能够按照按照规定好的顺序执行而不会被插队或打断);

    mysql事务的区别在于:mysql中事务开启后,当某一条语句执行出现错误时该事务会回退到开始时的状态,而redis中的事务却不会这么做!但是redis中可以去指定监测某一个Key值,当该Key值在开始事务后并且执行事务之前发生了变化的话,则该事务会被遗弃,事务中的命令将不会执行。

    redis事务中的常用命令:

    Multi 命令用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

    Exec 命令用于执行所有事务块内的命令。

    Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

    Unwatch 命令用于取消 WATCH 命令对所有 key 的监视。

    Discard 命令用于取消事务,放弃执行事务块内的所有命令。

    php中使用 redis处理秒杀:

    <?php
    /**
    * shop_sell_num 存储已经出售商品数量
    * shop_total  商品总数
    * shop_users_list 请购成功的用户信息
    */
    $shop_total = 100;
    
    $redis = new redis();
    
    $result = $redis->connect('127.0.0.1',6379);
    
    if(!$result){
        throw new Exception('redis连接失败');
    }
    
    //监视 shop_sell_num
    $redis->watch('shop_sell_num');
    $shop_sell_num = $redis->get('shop_sell_num');
    
    //判断商品是否剩余
    if($shop_sell_num < $shop_total){
    
        $redis->multi();
    
        $redis->set('shop_sell_num',$shop_sell_num+1);
    
        $multi_result = $redis->exec();
    
        if($multi_result){
            //将用户表示放入已购用户集合中
            $redis->sAdd('shop_users_list','用户信息');
        }else{
            return "抢购失败"
        }
    }else{
        return "抢购结束";
    }
  • 相关阅读:
    Auto Mapper01
    一个ActionResult中定位到两个视图—<团委项目>
    网站根目录的问题
    数据库基础和断点调试
    linux 环境下jmeter+ant+jenkins
    Postman 下载和使用
    用ExtentReports美化你的测试报告
    extentreports报告插件与testng集成
    SourceTree使用图解
    charles4.2下载与破解方法以及配置https
  • 原文地址:https://www.cnblogs.com/itsuibi/p/10769737.html
Copyright © 2011-2022 走看看