/** * 分布式锁 * @param $key * @param $fn * @param int $expires * @param int $tryTimes * @param int $code * @param string $msg * @return mixed * @throws ApiException */ public function distributeLock($key, $fn, $expires = 5, $tryTimes = 2, $code = 999, $msg = '请求太频繁,稍后再试!') { try { if (!is_callable($fn, true)) { throw new ApiException('抱歉,第二个入参[$fn]必须为函数!!', -1); } $try = 0; while (true) { if ($this->redis->set($this->formatKey($key), 1, ['nx', 'ex' => $expires])) { break; } if ($try > $tryTimes) { throw new \Exception($msg, $code); } $try++; usleep(50000);//休眠50毫秒 } $result = call_user_func($fn); $this->del($key); } catch (\Exception $e) { if ($e instanceof ApiException) { $this->del($key); } else { DI()->logger->error(__METHOD__, ['key' => $key, 'code' => $e->getCode(), 'msg' => $e->getMessage()]); } throw new ApiException($e->getMessage(), $e->getCode()); } return $result; }
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交