0) { $end = microtime(true) + ($waitTimeout / 1000); while (microtime(true) < $end) { if (Redis::set($lockKey, $lockValue, 'PX', $ttl, 'NX')) { $acquired = true; break; } usleep(100000); // 休眠100ms后重试 } } else { $acquired = Redis::set($lockKey, $lockValue, 'PX', $ttl, 'NX'); } if (!$acquired) { throw new Exception("Failed to acquire lock for key: {$key}"); } try { // 执行闭包 return $closure(); } finally { // 安全释放锁(仅当锁值未变时删除) Redis::eval("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end", 1, $lockKey, $lockValue); } } }