php之yii2简单分布式redis锁限制和缓存设置

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

yii2框架简单加锁锁定本次任务没执行完之前不允许再请求本次方法,注意这只是简单实现能应对几乎所有并发场景。

/**
     * 具体业务逻辑代码
     */
    public function business(){
        $key ='redis_key_name:'.'订单id或其他本次锁的唯一值';

        self::lockLimit($key);

//        //这里需要用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));
        }
    }

    /**
     * redis锁限制(设置锁的时间,具体看自己的业务场景,如果是限制手速的一般设置1秒,如果是限制本次情况处理完前不接受其他请求的一般设置120秒(一个接口请求一般不超过120秒))
     * $key 要限制的用户或订单唯一key值 ($key='redis_key_name:'.'订单id或其他本次锁的唯一值';)
     * $scene 场景 1、手速限制 2、处理事务限制
     * $expire 锁有效期,默认是有1和120秒的设置
     */
    public static function lockLimit($key,$scene=2,$expire=0){
        $redis=Yii::$app->redis;
        $lock_result = $redis->setnx($key,1);
        if($scene==1)$redis->expire($key, empty($expire)?1:$expire);

        //判断不是空直接中断本次操作
        if (!$lock_result) {
            //随便你们return或其他友好输出,下面的输出只是个人示例
            throw new Exception('-1000', "亲,太过频繁对身体不好");
        }
        if($scene==2)$redis->expire($key, empty($expire)?120:$expire);
    }

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

缓存设置
		$key='redis_key_name';
        $key_data=Yii::$app->redis->get($key);
        //判断不是空直接中断本次操作
        if(!empty($key_data)){
            //随便你们return或其他友好输出,下面的输出只是个人示例
            retrun json_decode($key_data,true);
        }
        

        //这里需要用try catch,防止中途出异常,导致没解锁
        try {
            //具体处理的业务逻辑代码
            $data=['内容'];
            //确定没锁后先赋值redis,锁上先
            Yii::$app->redis->set($key,json_encode($data));
            Yii::$app->redis->expire($key, 300); 
        } catch (\Throwable $e) {
            //日志方法,具体自己实现
            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' => 'BaseComponents\base\RedisConn',
            'hostname' => '127.0.0.1',
            'port'     => 6379,
        ],
    ]

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值