redis分布式锁

Redis有一系列的命令,其特点是以NX结尾,NX的意思可以理解为NOT EXISTS,SETNX命令(SET IF NOT EXISTS)可以理解为如果不存在则插入,Redis分布式锁的实现主要就是使用SETNX命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$key        = 'test';       
$lockKey = 'lock:'.$key;
$lockExpire = 10;

$result = $redis->get($key);
if(empty($result)) {
$status = TRUE;
while ($status){
$lockValue = time() + $lockExpire;
$lock = $redis->setnx($lockKey, $lockValue);
if(!empty($lock) || ($redis->get($lockKey) < time() && $redis->getSet($lockKey, $lockValue) < time() )) {
$redis->expire($lockKey, $lockExpire);
if($redis->ttl($lockKey)) {
$redis->del($lockKey);
}
$status = FALSE;
}else{
sleep(2);//等待2秒后再尝试执行操作
}
}
}