|
|
@@ -302,4 +302,74 @@ class util
|
|
|
self::encode(['code' => -1, 'msg' => $msg, 'data' => []]);
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+ /**
|
|
|
+ * [getLock 时间锁]
|
|
|
+ * @param [type] $key [string]
|
|
|
+ * @param integer $expire [time]
|
|
|
+ * @return [type] [bool]
|
|
|
+ */
|
|
|
+ public static function getLock($key, $expire = 10)
|
|
|
+ {
|
|
|
+
|
|
|
+ $redis = Yii::$app->redis;
|
|
|
+ return $redis->setex($key, $expire,time());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检测锁是否存在
|
|
|
+ * @param $key
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public static function checkLock($key)
|
|
|
+ {
|
|
|
+ $redis = Yii::$app->redis;
|
|
|
+ if($redis->get($key)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取锁
|
|
|
+ * @param String $key 锁标识
|
|
|
+ * @param Int $expire 锁过期时间
|
|
|
+ * @param Int $retry 等待次数
|
|
|
+ * @return Boolean
|
|
|
+ */
|
|
|
+ public static function lock($key, $expire = 5,$retry = 20)
|
|
|
+ {
|
|
|
+ $redis = Yii::$app->redis;
|
|
|
+ $is_lock = $redis->setex($key,$expire, time() + $expire);
|
|
|
+ // 不能获取锁
|
|
|
+ if (!$is_lock) {
|
|
|
+ // 判断锁是否过期 锁已过期 删除锁 重新获取 防止过期时间设置长,结束时没主动调unlock
|
|
|
+ $lock_time = $redis->get($key);
|
|
|
+ if($lock_time && time()>$lock_time){
|
|
|
+ self::unlock($key);
|
|
|
+ $is_lock = $redis->set($key, time()+$expire, ['nx', 'ex' => $expire]);
|
|
|
+ }
|
|
|
+ if(!$is_lock && $retry){
|
|
|
+ do {
|
|
|
+ $retry -= 1;
|
|
|
+ usleep(10000);
|
|
|
+ $is_lock = $redis->setex($key,$expire ,time() + $expire);
|
|
|
+ } while(!$is_lock && $retry);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $is_lock ? true : false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 释放锁
|
|
|
+ * @param String $key 锁标识
|
|
|
+ * @return Boolean
|
|
|
+ */
|
|
|
+ public static function unlock($key)
|
|
|
+ {
|
|
|
+ $redis = Yii::$app->redis;
|
|
|
+ return $redis->del($key);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|