From 262c3afb7b94904e6537c76734e3026f701520f5 Mon Sep 17 00:00:00 2001 From: mkm <727897186@qq.com> Date: Mon, 16 Jan 2023 14:43:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=95=86=E5=9F=8E2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crmeb/services/LockService.php | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 crmeb/services/LockService.php diff --git a/crmeb/services/LockService.php b/crmeb/services/LockService.php new file mode 100644 index 00000000..9cd18011 --- /dev/null +++ b/crmeb/services/LockService.php @@ -0,0 +1,52 @@ +lock($key, $key, $ex); + return $fn(); + } finally { + $this->unlock($key, $key); + } + } + + public function tryLock($key, $value = '1', $ex = 6) + { + return Cache::store('redis')->handler()->set('lock_' . $key, $value, ["NX", "EX" => $ex]); + } + + public function lock($key, $value = '1', $ex = 6) + { + if ($this->tryLock($key, $value, $ex)) { + return true; + } + System::sleep(1); + return $this->lock($key, $value, $ex); + } + + public function unlock($key, $value = '1') + { + $script = <<< EOF +if (redis.call("get", "lock_" .. KEYS[1]) == ARGV[1]) then + return redis.call("del", "lock_" .. KEYS[1]) +else + return 0 +end +EOF; + return Cache::store('redis')->handler()->eval($script, [$key, $value], 1) > 0; + } +} \ No newline at end of file