zoukankan      html  css  js  c++  java
  • Yii2 Mutex类封装和使用例子

    <?php
    
    namespace common\helpers;
    
    
    use yii\redis\Mutex;
    
    /**
     * 并发场景处理辅助方法类
     * Class ComplicateHelp
     * @package common\helpers
     */
    class ComplicateHelp
    {
        /**
         * 简单的加锁
         * @param $lockKey
         * @param int $timeout 锁多长时间
         * @param int $expire 锁的过期时间
         * @param string $keyPrefix key前缀
         * @return bool
         */
        public static function lock($lockKey, $timeout = 10, $expire = 0, $keyPrefix = '')
        {
            $config = [
                'class' => Mutex::class,
                'keyPrefix' => $keyPrefix,
            ];
            if ($expire) {
                $config['expire'] = $expire;
            }
            \Yii::$app->setComponents([
                'mutex' => $config
            ]);
    
            return \Yii::$app->mutex->acquire($lockKey, $timeout);
        }
    
        /**
         * 解锁
         * @param $lockKey
         */
        public static function unlock($lockKey)
        {
            \Yii::$app->mutex->release($lockKey);
        }
    
        /**
         * 加锁并且释放锁
         * @param \Closure $func
         * @param string $lockKey 锁的key
         * @param int $timeout 锁多长时间 默认10s
         * @param int $expire 锁的过期时间 默认60s
         * @param string $keyPrefix key前缀
         * @return mixed
         */
        public static function lockAndFree(\Closure $func, $lockKey, $timeout = 10, $expire = 0, $keyPrefix = '')
        {
            self::lock($lockKey, $timeout, $expire, $keyPrefix);
            $res = $func();
            self::unlock($lockKey);
            return $res;
        }
    }

    使用例子:

    $lockName = 'lock_test';
    
    //加锁
    $lock = ComplicateHelp::lock($lockName, 5, 120);
    if (!$lock) {
        throw new UserException('未获取到锁');
    }
    
    /**
     * do something
     **/
    
    //释放锁
    ComplicateHelp::unlock($lockName); 
  • 相关阅读:
    hdu4734 F(x)
    hdu2089 不要62 两解
    luogu2602 [ZJOI2010]数字计数 两解
    lemon
    UVA1218 完美的服务 Perfect Service
    luogu HNOI2003消防局的设立
    uva10891 game of sum
    uva10635 Prince and Princess
    UVA1394 And Then There Was One
    uva10003切木棍
  • 原文地址:https://www.cnblogs.com/-mrl/p/15628256.html
Copyright © 2011-2022 走看看