我正在考虑将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()
文档中没有提到这一点,希望它能帮助其他人。