TP redis 业务锁

<?php

namespace lediy\tools;


//redis 锁
use think\facade\Cache;
use think\facade\Log;

class Lock
{
public $redis;

protected $lockIds;

public function __construct()
{

$this->redis = Cache::store('redis')->handler();
}

/**
     * @param $name key名称
     * @param $expires 过期时间
     * @param $num 重试次数
     * @param $usleep   重试间隔
     * @return bool
     */
public function lock($name = 'default', $expires = 10, $num = 5, $usleep = 100000)
{

$res = false;
while ($num-- > 0) {
//获取锁
$value = md5(uniqid());
$res = $this->redis->set($name, $value, ['nx', 'ex' => $expires]);
if ($res) {
Log::write('获取锁成功,' . $name, 'le');
$this->lockIds[$name] = $value;
$res = true;
break;
}
//重试
usleep($usleep);
}

return $res;
}


public function unlock($name = 'default')
{

if (isset($this->lockIds[$name])) {
$localid = $this->lockIds[$name];
$rid = $this->redis->get($name);
if ($localid == $rid) {
$this->redis->del($name);
Log::write('解除锁成功,' . $name, 'le');
return true;
}
}

return  false;
}

function __destruct()
{
//Log::write($this->lockIds,'le');
if(!empty($this->lockIds)){
//Log::write(__FUNCTION__.'销毁lock','le');
foreach($this->lockIds as $k=>$v){
//Log::write($k,'le');
$this->unlock($k);
}
}
//方法体

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP柚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值