PHP模拟高并发异步请求测试+redis的setnx处理并发和防止死锁处理
/** PHP并发异步请求测试* /test/curlMulti*/public function curlMultiAction(){$urls = ["http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhost:801/api/order/create", "http://localhost:801/api/order/create",];//并发测试$url = 'http://localhost:801/api/order/create';$data=['customerId'=>'10000','customerOrderNo'=>'Test530051-'.uniqid(),'goodsId'=>'1001273','account'=>'18857850025x','num'=>1,'sign'=>'abDebug',];// 创建批处理cURL句柄$multi_handle = curl_multi_init();$curls = [];foreach ($urls as $url){$ch = curl_init();$data['customerOrderNo'] = uniqid('Test-');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_multi_add_handle($multi_handle, $ch);$curls[] = $ch;}$running = null;do {curl_multi_exec($multi_handle, $running);} while ($running > 0);foreach ($curls as $ch) {$response = curl_multi_getcontent($ch);echo "Response: " . $response . PHP_EOL;curl_multi_remove_handle($multi_handle, $ch);curl_close($ch);}curl_multi_close($multi_handle);die;}在 Redis 里,所谓 SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果,不过很多人没有意识到 SETNX 有陷阱!比如说:某个查询数据库的接口,因为调用量比较大,所以加了缓存,并设定缓存过期后刷新,问题是当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,大量并发请求会穿透缓存直接查询数据库,造成雪崩效应,如果有锁机制,那么就可以控制只有一个请求去更新缓存,其它的请求视情况要么等待,要么使用过期的缓存。下面以目前 PHP 社区里最流行的 PHPRedis 扩展为例,实现一段演示代码:<?php$ok = $redis->setNX($key, $value);if ($ok) {$cache->update();$redis->del($key);
}?>
缓存过期时,通过 SetNX 获取锁,如果成功了,那么更新缓存,然后删除锁。看上去逻辑非常简单,可惜有问题:如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防不测:<?php$redis->multi();
$redis->setNX($key, $value);
$redis->expire($key, $ttl);
$redis->exec();?>
<?php$ok = $redis->set($key, $random, array('nx', 'ex' => $ttl));if ($ok) {$cache->update();if ($redis->get($key) == $random) {$redis->del($key);}
}?>
Redis防死锁处理: $lock_key = 'locks_' . $userid;
$is_lock = $redis->setnx($lock_key , 1); // 加锁
if($is_lock == true){ // 获取锁权限// 程序逻辑处理:if ......// 释放锁$redis->del($lock_key);
}else{// 防止死锁if($redis->ttl($lock_key) == -1){$redis->expire($lock_key, 5);}return true; // 获取不到锁权限,直接返回
}
$redis->ttl设置过期时间。当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
相关文章:
PHP模拟高并发异步请求测试+redis的setnx处理并发和防止死锁处理
/** PHP并发异步请求测试* /test/curlMulti*/public function curlMultiAction(){$urls ["http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhost:801/api/order/create","http://localhos…...
访问网站出现“此站点不安全”如何解决
在网络浏览中,我们经常会遇到浏览器地址栏出现“此站点不安全”的警告。这通常意味着网站没有使用SSL(安全套接层)加密来保护用户数据的安全。那么,如何通过获得并安装SSL证书来消除这一警告,确保网站的安全可靠呢&…...
同一台电脑同时连接使用Gitee(码云)和Github
1、添加对应的密钥 ssh-keygen -t rsa -C "your_emailexample.com" -f ~/.ssh/github_id-rsa //生成github秘钥 ssh-keygen -t rsa -C "your_emailexample.com" -f ~/.ssh/gitee_id-rsa //生成码云秘钥 2、在 ~/.ssh 文件里会生成对应的文件 文件夹里会…...
GORM 插入和批量插入操作介绍
GORM 是一个功能强大的 Go 语言 ORM 库,它提供了简单易用的 API 来执行数据库操作。本文将介绍如何使用 GORM 进行单条记录插入和批量插入操作。 单条记录插入 在 GORM 中,插入一条记录非常简单。首先,你需要定义一个模型,该模型…...
企业CAD图纸加密软件推荐!2024年好用的10款CAD图纸加密软件排行
在现代企业中,CAD图纸作为重要的设计和工程数据,其安全性和保密性至关重要。为了防止图纸被非法获取、篡改或滥用,选择一款高效的CAD图纸加密软件显得尤为重要。本文将为您推荐2024年市场上十款好用的CAD图纸加密软件,帮助企业保护…...
智能电梯标志新时代:墨水屏电子标签引领变革
电梯安全墨水屏标签的智能设备悄然出现在各大写字楼和住宅区的电梯中,引发了广泛关注。这款设备替代了传统的纸质电梯标志,通过手机蓝牙标签APP直接进行编辑刷新内容,并具备Type-C接口充电功能。 本文将深入探讨这一创新技术的应用前景及其对…...
使用nvm下载nodejs版本报错
这里写自定义目录标题 使用nvm下载nodejs版本报错:Error retrieving "http://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": HTTP Status 404问题原因解决办法 使用nvm下载nodejs版本报错:Error retrieving “http://npm.taobao.org/m…...
深入理解CSS的:valid和:invalid伪类:增强表单验证的艺术
在现代网页设计中,用户输入验证是一个重要的环节,它不仅关乎用户体验,也是数据准确性和安全性的保障。CSS3引入了两个强大的伪类选择器::valid和:invalid,它们允许开发者通过CSS来增强表单输入的验证过程,而…...
稚晖君发布5款全能人形机器人,开源创新,全能应用
8月18日,智元机器人举行“智元远征 商用启航” 2024年度新品发布会,智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W,并展示了在机器人动力、感知、…...
【总结】冲击偶的概念与性质
冲击偶的概念与性质...
Hbase图形化界面
分享一个好用的hbase图形化界面 安装包:链接: https://pan.baidu.com/s/11Y2cDlme-P2xe--pYqy6MQ?pwdguag 提取码: guag 1、上传项目到linux 2、修改数据库配置信息 application-druid.yml 修改url、username、password为数据库连接信息 3、创建数据库(注意字符集…...
PhalApi:在宝塔一键安装部署PHP开源接口框架的教程
如何在宝塔上,一键安装部署PhalApi开源接口框架? 第一步,进入你的宝塔 - 软件商店。 第二步,切换到:一键部署; 第三步,搜索 phalapi; 第四步,点击 一键部署࿱…...
什么是BERT?工程快速入门
基本介绍 全称是Bidirectional Encoder Representations from Transformers。BERT翻译成中文通常被称为“双向编码器表征法”或简单地称为“双向变换器模型” Bidirectional:是双向神经网络,这个在学习 RNN 时候我们就了解到如何使用双向 RNN 让每一个…...
SQL - 事务
事务是代表单个工作单元的一组SQL语句,当我们需要对数据库进行多次更改的情况下,要使用事务,我们希望所有这些更改作为一个单元一起成功或失败事务属性 (ACID) 原子性(Atomicity):事务中的所有操作要么全部完成,要么全…...
系统, 安装完以后只能进ubuntu
1.问题 在已经安装了Windows10系统的情况下,用U盘安装Ubuntu 16.04双系统, 安装完以后只能进ubuntu,在grub系统选择界面,Windows10操作系统的选项都没有。 2.解决办法 进入ubuntu系统,打开终端输入: sudo update-g…...
闲鱼功能全解析:闲置物品快速变现
咸鱼(现已更名为闲鱼)作为一款闲置交易平台,其功能设计旨在提供一个方便、安全的环境,让用户能够轻松地买卖二手物品。以下是对咸鱼(闲鱼)功能的详细分析 1. 商品发布与管理 商品发布:用户可以…...
牛客网SQL进阶129 :月均完成试卷数不小于3的用户
月均完成试卷数不小于3的用户爱作答的类别_牛客题霸_牛客网 0 问题描述 基于试卷作答记录表exam_record、试卷信息表examination_info ,统计出 “月均完成试卷数”不小于3的用户作答的类别及作答次数,按次数降序输出。 1 数据准备 drop table if exis…...
Astro + Cloudflare Pages 快速搭建个人博客
目录 1 选择 Astro 模板2 使用代码3 修改代码4 上传 Github5 部署 Cloudflare Pages6 后续修改 最近我搭建完了我的个人网站,很多人问是怎么做的,今天就来写一篇教程吧。 全部干货,看完绝对能成功搭建自己的网站!(还不…...
Vue中<style scoped>与<style module>的深入解析与应用
在Vue开发中,样式管理是一个重要的环节。Vue提供了多种方式来帮助开发者更有效地管理组件样式,其中<style scoped>和<style module>是两个非常实用的特性。本文将深入探讨这两个属性的作用、原理以及使用场景,帮助读者更好地理解…...
Qt系列之数据库(二)代码篇
Qt 数据库开发是指在Qt框架下进行数据库操作的开发工作。Qt提供了一套强大的数据库模块,可以方便地与多种数据库进行交互,如SQLite、MySQL、PostgreSQL等。以下是一些关键点和步骤,帮助你进行Qt数据库开发: 1. 安装Qt数据库模块 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...
