以下代码为实现代码:
// 类
class Redislock {
protected $redis;
//利用构造函数实现redis连接
public function __contruct(){
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$this->redis = $redis;
}
//获取lock
public function getLock($key){
$value = $this->redis->get($key);
return $value;
}
//设置 key
// 这里记得使用setnx 他的作用在指定的 key 不存在时,为 key 设置指定的值。
//不要使用set命令 set设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。
// 设置过期时间 防止业务中因业务代码报错没有解锁导致死锁
public function setKey($key,$value,$second){
$setnx = $this->redis->setnx($key,$value);
if(!$setnx){
return false;
}
$expire = $this->redis->expire($key,$second);
if(!$expire){
$this->redis->del($key);
}
return $expire;
}
//删除del
public function delLock($key){
$lineNumber = $this->redis->del($key);
return $lineNumber;
}
}
//业务实现
$key = 'lock_key'; //设置锁的key
$value = 'value'; //设置锁的值
$redisLock = new Redislock();
$islock = $redisLock->getLock($key);
if($islock){
//已有锁,直接返回,不往下执行了
return false;
}
$second = 6; //设置锁的过期时间
$setlock = $redisLock->setLock($key,$value,$second);
if(!$setLock){
return false;
}
//todo 执行业务
sleep(5);
$redisLock->delLock($key);