【laravel+redis】分布式锁的实现

laravel官方支持“原子锁”,并且说“要使用这个功能,应用必须使用 memcacheddynamodbredisdatabase 或 array 缓存驱动作为应用默认的缓存驱动,此外,所有服务器必须和同一台中央缓存服务器进行通信”。前半句不多解释,后半句也强调了laravel的原子锁不负责在集群架构中保障故障转移期间的数据安全性。

我贴一下laravel的源码看一下它是怎样用redis实现的分布式锁,我本机是laravel8,redis6,laravel6、7也都可以用,代码没什么变化。

1.laravel中实现一个锁的demo

use Illuminate\Contracts\Cache\LockTimeoutException;//抛出异常类
    
$lock = Cache::lock('foo', 10);//持有锁10s
    
try {
    $lock->block(5);
    
    // 最长等待 5s 后获取锁...
} catch (LockTimeoutException $e) {
    // 无法获取锁...
} finally {
    optional($lock)->release();
}
    
Cache::lock('foo', 10)->block(5, function () {
    // 最长等待 5s 后获取锁...
});

发现它用了Cache门面的lock方法,去\vendor\laravel\framework\src\Illuminate\Support\Facades\Cache.php看一下,

/**
 * @method static \Illuminate\Cache\TaggedCache tags(array|mixed $names)
 * @method s

你可能感兴趣的:(php,laravel,redis,laravel,redis,php)