/**
* 加锁
* @param $key
* @param int $ttl 锁有效期/秒
* @param int|null $block 延迟锁延迟间隙/毫秒
* @param callable|null $fun 延迟结束后回调
* @return bool|mixed true=已经锁住,获取锁失败;false=没有锁住,获取锁成功
* @static
*/
public static function lock($key, int $ttl = 1, int $block = null, callable|null $fun = null): mixed
{
$key = 'redisLock:' . $key;
// 加锁成功
if (self::set($key, 1, 'EX', $ttl, 'NX')) {
return false;
}
// 设置了延迟等待锁
if ($block > 0) {
// 锁存在时则等待解锁
while (self::exists($key)) {
if (!self::exists($key)) {
return false; // 锁不存在,解锁
}
usleep($block * 1000);
}
// 解锁后存在回调,则执行回调
if ($fun) {
return $fun();
}
}
return true;
}
/**
* 解锁
* @param $keys
* @static
* @return int
*/
public static function unlock(...$keys): int
{
$count = 0;
foreach (func_get_args() as $key) {
$count += self::del('redisLock:' . $key);
}
return $count;
}
redis加锁解锁
最新推荐文章于 2024-10-10 22:57:06 发布