(Cache::lock()) -> get() -- 在什么情况下它返回 false?



我正在考虑将Cache::lock机制与laravel一起使用,但有些事情我并不完全清楚

这是他们使用的例子:

$lock = Cache::lock('foo', 10);
if ($lock->get()) {
// Lock acquired for 10 seconds...
$lock->release();
}

现在,我的理解是,在NORMAL条件下,如果调用$lock->get()时锁仍在原位,它将等待前一个锁释放后再继续。这是正确的吗?(对我来说,这似乎是锁的全部意义,所以我当然希望这是正确的(。

如果这是正确的,那么什么会使$lock->get()返回false呢?如果它期望等待时间超过10秒或类似的时间,它会返回false吗?

在laravel文档和源代码中找到相关内容并不容易。我所能收集到的是,对Cache::lock的调用并没有获取它,它似乎只定义了什么可以被锁定。

get()block()的调用似乎完成了实际的获取。

我的假设如下:

  • Cache::lock(foo, n)将在foo上创建一个最长可保持n秒的新锁
  • $lock->get()将尝试获取它,如果它已经被其他人持有,则返回false
  • $lock->block(n)将尝试获取它并阻止最长n秒,如果在此期间未能获取,则抛出LockTimeoutException

您应该测试它是否真的遵循了这种行为,尽管我无法证实这一点。


参考:

  • Laravel Lock文档
  • 照明/缓存/锁定.php

$lock->get()的调用也会锁定。试试这个代码

Log::info('checkpoint 2 ' .  $lock->owner() . " - get? " . ($lock->get() ? "true" : "false") );
Log::info('checkpoint 2A ' .  $lock->owner() . " - get? " . ($lock->get() ? "true" : "false") );

它将返回

[2022-05-12 22:41:11] production.INFO: checkpoint 2 l5qJhOOORy1nNFHt - get? true
[2022-05-12 22:41:11] production.INFO: checkpoint 2A l5qJhOOORy1nNFHt - get? false

从以上结果可以看出,第一个$lock->get()将得到返回布尔值true,第二个$lock->get()将得到返回boolean false。这表明$lock->get()也会执行一些锁定线程,直到您执行$lock->release()$lock->forceRelease()

文档中没有提到这一点,希望它能帮助其他人。

最新更新