[redis] 單機分佈性鎖

[redis] 單機分佈性鎖

// 單機的分布性鎖
// 1. EX 表示鎖會過期釋放,設置單位為秒。 PX 的設置單位為毫秒
// 2. NX 保證原子性
// 3. 解鎖時比對資源對應產生的 UUID,避免誤解鎖
$getLock = $redis->set('user:userid:9:transferAction', 12345, 'NX', 'PX', 6000);
$redis->set('1:first:lock:result', $getLock); // 這邊成功回傳 OK
$getLockAgain = $redis->set('user:userid:9:transferAction', 12345, 'NX', 'PX', 6000);
$redis->set('2:get:lock:again', $getLockAgain); // NX 只在鍵不存在時,才對鍵進行設置操作,這邊會回傳 nil
// do something
// 刪除分佈性鎖前,先檢查value帶的UUID是否相同,避免誤解鎖
if ($redis->get('user:userid:9:transferAction') == 12345) {
    $deleteResult = $redis->del(['user:userid:9:transferAction']); // 成功回傳1, 失敗回傳0
    $redis->set('delete-result', $deleteResult);
}
$getLockAgainAgain = $redis->set('user:userid:9:transferAction', 12345, 'NX', 'PX', 6000);
$redis->set('3:third-lock', $getLockAgainAgain);
$redis->set('uuid', uniqid(), 'NX', 'EX', 20);