一个简单的PHP REDIS分布式锁类 外部使用获取锁和释放锁来处理本身的业务逻辑便可git
/** * Class DistributedLocks 基于redis的分布式锁 */ class DistributedLocks { /** * 获取锁函数 * @param $key string 锁key * @param $expire string 锁定的时间 * @return bool 获取结果 失败false 成功true 外面作业务逻辑处理 */ public function lock($key, $expire) { // 判断参数是否为空 if (empty($key) || empty($expire)) { return false; } $redis = Predis::getInstance(); $result = $redis->get($key); if (!$result) { // 若是没有值 设置值 $lock_result = SETNX($key, time() + $expire); if ($lock_result) { // 加锁成功 设置过时时间 $redis->expire($key, $expire); return true; } } else { // 有值 判断是否 过时 防止死锁 if ($redis->get($key) < time()) { // 上锁判断上一个值是否过时 防止其余进程已经上锁 if ($redis->getSet($key, time() + $expire) < time()) { $redis->expire($key, $expire); return true; } } } return false; } /** * 释放锁函数 * @param $key string 锁key * @return bool 释放结果 */ public function release($key) { $redis = Predis::getInstance(); if ($redis->ttl($key)) { $redis->del($key); } return true; } }
github地址github