//签到送积分
$userId = $userinfo['MemberID']; // 需要加锁的用户ID
$lockKey = 'user_lock:' . $userId;
// 加锁
$isLocked = false;
$lockExpireTime = 10; // 锁的超时时间,以秒为单位
$lockTimeout = 2000; // 尝试获取锁的超时时间,以毫秒为单位
$startTimestamp = microtime(true) * 1000; // 记录开始时间戳
while (microtime(true) * 1000 - $startTimestamp < $lockTimeout) {
// 在尝试获取锁之前,先检查锁是否已经存在(可能是其他进程创建的)
$isLockExists = Cache::store('redis')->get($lockKey);
if ($isLockExists) {
// 锁已经存在,等待一段时间继续尝试获取锁
usleep(100000); // 休眠100毫秒
continue;
}
// 尝试获取锁
$isLocked = Cache::store('redis')->setnx($lockKey, true);
if ($isLocked) {
// 锁获取成功,设置过期时间
Cache::store('redis')->expire($lockKey, $lockExpireTime);
break;
} else {
// 等待一段时间继续尝试获取锁
usleep(100000); // 休眠100毫秒
continue;
}
}
if (!$isLocked) {
return app('json')->fail('请稍后重试');
}
//todo list
$resCheckInCount = $this->checkin($userinfo, $CampaignInfo);
// 解锁
Cache::store('redis')->del($lockKey);
redis分布式锁实际应用
于 2023-09-11 09:54:58 首次发布