thinkphp redis 锁
时间: 2023-10-12 22:14:57 浏览: 57
ThinkPHP框架中使用Redis实现分布式锁可以避免多个进程同时对同一个资源进行访问的问题。下面是使用Redis实现分布式锁的示例代码:
```php
use think\cache\driver\Redis;
class Lock
{
protected $redis; // Redis实例
protected $prefix = 'lock:'; // 锁前缀
protected $timeout = 10; // 锁过期时间,单位秒
public function __construct(Redis $redis) {
$this->redis = $redis;
}
public function lock($key) {
$lockKey = $this->prefix . $key;
$expireTime = time() + $this->timeout + 1;
// 通过SET命令尝试获取锁,如果key不存在,则SET命令会创建一个key并将其设置为1
// 如果key已经存在,则SET命令不会执行任何操作
$result = $this->redis->set($lockKey, 1, ['NX', 'EX' => $this->timeout]);
// SET命令返回成功表示获取到锁,否则获取锁失败
if ($result === false) {
return false;
}
// 设置锁的过期时间,防止进程崩溃或者意外中断导致死锁
$this->redis->set($lockKey . ':expire', $expireTime);
return true;
}
public function unlock($key) {
$lockKey = $this->prefix . $key;
// 释放锁需要先检查锁是否已经过期
$expireTime = $this->redis->get($lockKey . ':expire');
if ($expireTime > time()) {
// 如果锁未过期,则删除锁
$this->redis->del($lockKey);
$this->redis->del($lockKey . ':expire');
}
}
}
```
上面的代码中,使用了Redis的SET命令尝试获取锁,通过提供NX(只有键不存在时才能设置成功)和EX(过期时间)选项来确保只有一个进程能够获取到锁。如果获取锁失败,则说明该资源已经被其他进程锁定,此时需要等待一段时间后再次尝试获取锁。释放锁时,需要先检查锁是否已经过期,如果锁未过期,则删除锁。