四时宝库

程序员的知识宝库

php 基于redis的分布式锁(php redis 分布式锁)

<?php

namespace app\api\service;

use app\api\traits\Singleton;

/**
 * 分布式锁
 * Class LockService
 * @package app\api\service
 */
class LockService extends BaseService
{
    private $lockValue;
    //有效期,5秒钟
    private $expireTime = 5;

    //使用场景
    private $scene;
    //redis连接实例
    private $redis;

    public function __construct($scene = 'kill', $expireTime = 5)
    {
        $this->scene = $scene;
        $this->expireTime = $expireTime;
        $this->redis = RedisService::getInstance()->client();
    }

    //加锁
    public function lock()
    {
        $this->lockValue = md5(uniqid());
        $result = $this->redis->set($this->scene, $this->lockValue,
            'EX', $this->expireTime,'NX');
        if(empty($result)){
            return false;
        }
        return true;
    }

    //释放锁
    public function unlock()
    {
        $script = <<<LUA
        local key=KEYS[1]
        local value=ARGV[1]
        if(redis.call('get', key) == value)
        then
            return redis.call('del', key)
        end
LUA;
        $this->redis->eval($script, 1, $this->scene, $this->lockValue);
    }

}

/*
//调用执行
$lockService = new LockService('kill');
if($lockService->lock()){
    //自行相关操作

    //释放锁
    $lockService->unlock();
}
else{
    echo "请求频繁,请稍后再操作\n";
}
*/

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接