zoukankan      html  css  js  c++  java
  • php之yii2简单redis锁限制

    yii2框架简单加锁锁定本次任务没执行完之前不允许再请求本次方法,注意这只是简单实现能应对几乎所有并发场景,但是对并发有绝对要求的还是要用队列加异步处理去实现。

    		$key='redis_key_name:'.'订单id或其他本次锁的唯一值';
            //判断不是空直接中断本次操作
            if(!empty(Yii::$app->redis->get($key))){
                //随便你们return或其他友好输出,下面的输出只是个人示例
                throw new Exception(-10007, "红包领取中,请稍后");
            }
            //确定没锁后先赋值redis,锁上先
            Yii::$app->redis->set($key,'1');  //随便打上个1做标识
            Yii::$app->redis->expire($key, 300); //设置锁的时间,具体看自己的业务场景,一般一个接口请求不超过60秒
    
            //这里需要用try catch,防止中途出异常,导致没解锁
            try {
                //具体处理的业务逻辑代码
                Yii::$app->redis->del($key); //业务逻辑处理完毕,解锁
            } catch (Throwable $e) {
                Yii::$app->redis->del($key); //业务逻辑处理失败,还是解锁
                //日志方法,具体自己实现
                CoreHelper::write(json_encode(['eventName','order_id'=>$order->order_id??'',$e->getMessage()], JSON_UNESCAPED_UNICODE));
            }
    

    注意:
    1、Throwable为php7及以上版本的万能捕获任何异常,php7以下版本用:Exception
    2、请确定自己已经在配置文件配置redis配置
    找到config/development.php(开发环境)或config/production.php(生产环境),在'components' => []中加入,如:

        'components' => [
        	'redis' => [
                'class' => 'BaseComponentsaseRedisConn',
                'hostname' => '127.0.0.1',
                'port'     => 6379,
            ],
        ]
    

    3、Yii如果找不到请在命名空间后加 use Yii;

    作者:xingguang
    链接:原文链接:hhttps://www.tiance.club/post/2709942805.html

  • 相关阅读:
    archlinux 安装deepin桌面连接wifi不能输入密码
    LinuxMint/Ubuntu 关机重启等待 90 秒问题的解决办法
    WPS for Linux 字体配置(字体缺失解决办法)
    mysql 找回密码
    SQL的四种连接-左外连接、右外连接、内连接、全连接
    springmvc+shiro应用配置
    java手机验证码实现
    maven+ssm+cxf3配置例子
    破碎之花--普西拉之歌
    HTML5示例程序地址
  • 原文地址:https://www.cnblogs.com/yizhidaozuihou/p/12446043.html
Copyright © 2011-2022 走看看