基于redis的高并发分布式锁实现方案
思路:利用 Redis 的 SETNX() 和 EXPIRE() 操作实现分布式锁。
SETNX(key, value) 操作会将 key 设置为 value,当且仅当 key 不存在。如果 key 已经存在,则返回 0,表示获取锁失败。否则返回 1,表示获取锁成功。
EXPIRE(key, seconds) 操作用来设置 key 的过期时间,如果 key 在 seconds 秒内没有被修改过,那么 Redis 将自动删除该 key,从而释放锁。
实现代码如下:
```php
use Redis;
class DistributedLock
{
private $redis;
public function __construct()
{
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', '6379');
}
/**
* 获取锁
*
* @param string $key 锁的名称
* @param int $timeout 超时时间(单位:毫秒)
* @return bool 获取锁是否成功
*/
public function acquireLock($key, $timeout = 1000)
{
$startTime = microtime(true) * 1000; // 开始时间(单位:毫秒)
$expireTime = $startTime + $timeout; // 超时时间(单位:毫秒)
while (true) {
$result = $this->redis->setnx($key, $expireTime);
if ($result === 1) { // 成功获取锁
$this->redis->expire($key, $timeout / 1000);
return true;
}
// 获取锁超时
$currentTime = microtime(true) * 1000;
if ($currentTime > $expireTime) {
return false;
}
usleep(100); // 暂停 100 微秒后再重新尝试获取锁
}
}
/**
* 释放锁
*
* @param string $key 锁的名称
* @return bool 释放锁是否成功
*/
public function releaseLock($key)
{
return $this->redis->del($key) === 1;
}
}
```
使用示例:
```php
$lock = new DistributedLock();
if ($lock->acquireLock('key')) {
// 执行需要加锁的业务逻辑
// ...
$lock->releaseLock('key');
} else {
echo '获取锁失败';
}
```
在高并发场景下,使用基于 Redis 的分布式锁可以保证多个进程或者多台机器上的进程不会同时执行同一个逻辑,从而确保数据的一致性。
版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。
本文链接:基于redis的高并发分布式锁实现方案 - http://www.wlphp.com/?post=403