php redis互斥锁

redis = $redis;
    }

    /**
     * 获得锁
     * @param $key
     * @param $timeOut int 超时秒数默认10秒
     * @return bool|int  获得成功锁返回随机value
     */
    public function lock($key, $timeOut = 10){
        $myRandomValue = mt_rand();
        $key = self::LOCK_REDIS_KEY_PREFIX.$key;
        if($this->redis->eval("return redis.call('SET', KEYS[1], KEYS[2], 'NX', 'PX', KEYS[3])", 3, $key, $myRandomValue, $timeOut*1000)){
            return $myRandomValue;
        }
        return false;
    }

    /**
     * 解锁
     * !这里如果锁自动过期不存在了也返回 解锁成功true!
     * @param $key
     * @param $myRandomValue int 解锁随机值
     * @return bool
     */
    public function unLock($key, $myRandomValue){
        $key = self::LOCK_REDIS_KEY_PREFIX.$key;
        if($this->redis->eval("if redis.call('EXISTS',KEYS[1]) == 0 then return 1 else if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end end", 1, $key, $myRandomValue)){
            return true;
        }
        return false;
    }
}

这里需要明白为什么使用lua脚本,因为redis的lua脚本是原子性(事务)的,加锁解锁整个过程必须保证原子性(事务),具体的原理可以参考:《Redis官方文档》用Redis构建分布式锁

php redis互斥锁_第1张图片

你可能感兴趣的:(php)