Laravel 里的 mutex lock(互斥锁)
官方已经帮你封装好了,核心就是:用 Cache 实现分布式锁(支持 Redis / Memcached 等)
基本不用自己造轮子。
一、最标准用法
use Illuminate\Support\Facades\Cache;
Cache::lock('my-lock', 10)->get(function () {
// 这里的代码同一时间只会执行一次
});
说明
'my-lock'锁名(全局唯一)10锁过期时间(秒)get()获取锁并执行闭包
二、手动控制锁
$lock = Cache::lock('my-lock', 10);
if ($lock->get()) {
try {
// do something
} finally {
$lock->release();
}
}
三、阻塞等待锁
Cache::lock('my-lock', 10)->block(5, function () {
// 最多等待 5 秒获取锁
});
行为
| 情况 | 结果 |
|---|---|
| 5 秒内拿到锁 | 执行 |
| 拿不到 | 抛异常 |
底层驱动要求
互斥锁的可靠性完全取决于你的 Cache Driver。
| 驱动 | 是否支持 Mutex | 评价 |
| Redis / Memcached | 支持 (推荐) | 这是生产环境的最佳选择,支持真正的原子性操作。 |
| Database | 支持 | 可行,但在高并发下会增加数据库 I/O 负担。 |
| Array / File | 不推荐 | array 仅限单次请求;file 在多服务器环境下无效。 |
常见坑点与最佳实践
死锁问题:如果你的代码在持有锁时发生了致命错误(Fatal Error)且没设置过期时间,锁可能永远不会释放。始终建议为锁设置合理的 TTL(生存时间)。
分布式锁:如果你有多台 Web 服务器,务必确保所有服务器连接的是同一个 Redis 实例,否则互斥锁将失效。