0%

php+redis实现分布式锁

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

一、命令

  1. 旧版本

    • setnx my_key myvalue
    • expire my_key 5
    • del my_key
  2. 新版本

    • set key value EX 60 NX

二、DEMO

  1. 基于setnx版本(多个命令无法保证事务性操作)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$key = 'test';
$lockKey = 'lock:' . $key;
$expire = 60;
$result = $redis->get($lockKey);
if (empty($result)) {
$status = true;
while ($status) {
$lockValue = time() + $expire;
$lock = $redis->setnx($lockKey, $lockValue);
if ($lock || ($redis->get($lockKey) < time() && $redis->getSet($lockKey, $lockValue) < time() )) {
$redis->expire($lockKey, $expire);
if ($redis->ttl($lockKey) < 0) {
$redis->del($lockKey);
}
$status = false;
} else {
sleep(2);
}
}
}
  1. 基于lua版本

  2. 基于set版本

三、参考

  1. 参考一