这种并发锁的原理是啥
自己见过的锁都是类似先定义一个变量 = true, 相关操作完成之后再把相关的值变成false.
<code>$lock_num = 0; while(!redis_helper::lock("lottery")) { if($lock_num >= 300) { return "亲,好多人在排队抢红包啊,请重新进入页面"; } // 0.1s usleep(100000); $lock_num ++; } 下面是并发锁定的相关函数, 自己能明白这个锁每6s会变换一次真假值,但是不明白结合上面的$lock_num针对的并发情况到底是啥? 没6s变换真假值,6s/0.1s = 60次,怎么会达到300,页面卡住了,其他人恰好重新将锁设置为假? /** * 并发锁定 * @param string $name 锁名称 * @param int $expires 超时失效的时间,单位秒 * @return bool true:获取锁成功,false:获取锁失败 */ public static function lock($name, $expires = 5) { self::init_redis(); $key = $name . '_lock'; $now = time(); $val = $now + $expires + 1; if(self::$redis->setnx($key, $val)) { return true; } else { $old_val = self::$redis->get($key); // 失效的情况 if($now > $old_val && $now > self::$redis->getSet($key, $val)) { return true; } } return false; } </code>
回复内容:
自己见过的锁都是类似先定义一个变量 = true, 相关操作完成之后再把相关的值变成false.
<code>$lock_num = 0; while(!redis_helper::lock("lottery")) { if($lock_num >= 300) { return "亲,好多人在排队抢红包啊,请重新进入页面"; } // 0.1s usleep(100000); $lock_num ++; } 下面是并发锁定的相关函数, 自己能明白这个锁每6s会变换一次真假值,但是不明白结合上面的$lock_num针对的并发情况到底是啥? 没6s变换真假值,6s/0.1s = 60次,怎么会达到300,页面卡住了,其他人恰好重新将锁设置为假? /** * 并发锁定 * @param string $name 锁名称 * @param int $expires 超时失效的时间,单位秒 * @return bool true:获取锁成功,false:获取锁失败 */ public static function lock($name, $expires = 5) { self::init_redis(); $key = $name . '_lock'; $now = time(); $val = $now + $expires + 1; if(self::$redis->setnx($key, $val)) { return true; } else { $old_val = self::$redis->get($key); // 失效的情况 if($now > $old_val && $now > self::$redis->getSet($key, $val)) { return true; } } return false; } </code>
我的理解是尝试300次获取锁,如果失败了,就告诉用户失败。
成功获取锁的话,有6秒的独占时间。这个时间用来给程序处理后续的业务逻辑,比如生成订单。6秒过后,下一个用户进来,继续获取锁。
lock ->do sth. ->release
lock ->do sth. ->release
lock ->do sth. ->release
lock ->do sth. ->release
$lock_num跟锁没有关系,$lock_num只是用来记录重试的次数,比如当前同时有1000个用户在抢这个锁,而你如果重试了300次(30秒)还没有抢到锁就待会再来吧。
循环会每隔0.1秒重试一次,但是因为一个锁会占用6秒的时间,所以实际上在300次循环中(30秒)其实只有5次竞争锁的机会。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 是一个开源MVC 框架。它使开发、部署和维护应用程序变得更加容易。 CakePHP 有许多库可以减少大多数常见任务的过载。

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

CMS 代表内容管理系统。它是一种软件应用程序或平台,使用户能够创建、管理和修改数字内容,而无需先进的技术知识。 CMS 允许用户轻松创建和组织内容

数组是编程中用于处理数据的线性数据结构。有时在处理数组时,我们需要向现有数组中添加新元素。在本文中,我们将讨论几种在PHP中向数组末尾添加元素的方法,并附带代码示例、输出以及每种方法的时间和空间复杂度分析。 以下是向数组添加元素的不同方法: 使用方括号 [] 在PHP中,向数组末尾添加元素的方法是使用方括号[]。此语法仅适用于我们只想添加单个元素的情况。以下是语法: $array[] = value; 示例
