当前位置: 首页 > news >正文

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…...

访问网站出现“此站点不安全”如何解决

在网络浏览中&#xff0c;我们经常会遇到浏览器地址栏出现“此站点不安全”的警告。这通常意味着网站没有使用SSL&#xff08;安全套接层&#xff09;加密来保护用户数据的安全。那么&#xff0c;如何通过获得并安装SSL证书来消除这一警告&#xff0c;确保网站的安全可靠呢&…...

同一台电脑同时连接使用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 库&#xff0c;它提供了简单易用的 API 来执行数据库操作。本文将介绍如何使用 GORM 进行单条记录插入和批量插入操作。 单条记录插入 在 GORM 中&#xff0c;插入一条记录非常简单。首先&#xff0c;你需要定义一个模型&#xff0c;该模型…...

企业CAD图纸加密软件推荐!2024年好用的10款CAD图纸加密软件排行

在现代企业中&#xff0c;CAD图纸作为重要的设计和工程数据&#xff0c;其安全性和保密性至关重要。为了防止图纸被非法获取、篡改或滥用&#xff0c;选择一款高效的CAD图纸加密软件显得尤为重要。本文将为您推荐2024年市场上十款好用的CAD图纸加密软件&#xff0c;帮助企业保护…...

智能电梯标志新时代:墨水屏电子标签引领变革

电梯安全墨水屏标签的智能设备悄然出现在各大写字楼和住宅区的电梯中&#xff0c;引发了广泛关注。这款设备替代了传统的纸质电梯标志&#xff0c;通过手机蓝牙标签APP直接进行编辑刷新内容&#xff0c;并具备Type-C接口充电功能。 本文将深入探讨这一创新技术的应用前景及其对…...

使用nvm下载nodejs版本报错

这里写自定义目录标题 使用nvm下载nodejs版本报错&#xff1a;Error retrieving "http://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": HTTP Status 404问题原因解决办法 使用nvm下载nodejs版本报错&#xff1a;Error retrieving “http://npm.taobao.org/m…...

深入理解CSS的:valid和:invalid伪类:增强表单验证的艺术

在现代网页设计中&#xff0c;用户输入验证是一个重要的环节&#xff0c;它不仅关乎用户体验&#xff0c;也是数据准确性和安全性的保障。CSS3引入了两个强大的伪类选择器&#xff1a;:valid和:invalid&#xff0c;它们允许开发者通过CSS来增强表单输入的验证过程&#xff0c;而…...

稚晖君发布5款全能人形机器人,开源创新,全能应用

8月18日&#xff0c;智元机器人举行“智元远征 商用启航” 2024年度新品发布会&#xff0c;智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W&#xff0c;并展示了在机器人动力、感知、…...

【总结】冲击偶的概念与性质

冲击偶的概念与性质...

Hbase图形化界面

分享一个好用的hbase图形化界面 安装包&#xff1a;链接: https://pan.baidu.com/s/11Y2cDlme-P2xe--pYqy6MQ?pwdguag 提取码: guag 1、上传项目到linux 2、修改数据库配置信息 application-druid.yml 修改url、username、password为数据库连接信息 3、创建数据库(注意字符集…...

PhalApi:在宝塔一键安装部署PHP开源接口框架的教程

如何在宝塔上&#xff0c;一键安装部署PhalApi开源接口框架&#xff1f; 第一步&#xff0c;进入你的宝塔 - 软件商店。 第二步&#xff0c;切换到&#xff1a;一键部署&#xff1b; 第三步&#xff0c;搜索 phalapi&#xff1b; 第四步&#xff0c;点击 一键部署&#xff1…...

什么是BERT?工程快速入门

基本介绍 全称是Bidirectional Encoder Representations from Transformers。BERT翻译成中文通常被称为“双向编码器表征法”或简单地称为“双向变换器模型” Bidirectional&#xff1a;是双向神经网络&#xff0c;这个在学习 RNN 时候我们就了解到如何使用双向 RNN 让每一个…...

SQL - 事务

事务是代表单个工作单元的一组SQL语句&#xff0c;当我们需要对数据库进行多次更改的情况下&#xff0c;要使用事务&#xff0c;我们希望所有这些更改作为一个单元一起成功或失败事务属性 (ACID) 原子性(Atomicity)&#xff1a;事务中的所有操作要么全部完成&#xff0c;要么全…...

系统, 安装完以后只能进ubuntu

1.问题 在已经安装了Windows10系统的情况下&#xff0c;用U盘安装Ubuntu 16.04双系统&#xff0c; 安装完以后只能进ubuntu&#xff0c;在grub系统选择界面&#xff0c;Windows10操作系统的选项都没有。 2.解决办法 进入ubuntu系统&#xff0c;打开终端输入: sudo update-g…...

闲鱼功能全解析:闲置物品快速变现

咸鱼&#xff08;现已更名为闲鱼&#xff09;作为一款闲置交易平台&#xff0c;其功能设计旨在提供一个方便、安全的环境&#xff0c;让用户能够轻松地买卖二手物品。以下是对咸鱼&#xff08;闲鱼&#xff09;功能的详细分析 1. 商品发布与管理 商品发布&#xff1a;用户可以…...

牛客网SQL进阶129 :月均完成试卷数不小于3的用户

月均完成试卷数不小于3的用户爱作答的类别_牛客题霸_牛客网 0 问题描述 基于试卷作答记录表exam_record、试卷信息表examination_info &#xff0c;统计出 “月均完成试卷数”不小于3的用户作答的类别及作答次数&#xff0c;按次数降序输出。 1 数据准备 drop table if exis…...

Astro + Cloudflare Pages 快速搭建个人博客

目录 1 选择 Astro 模板2 使用代码3 修改代码4 上传 Github5 部署 Cloudflare Pages6 后续修改 最近我搭建完了我的个人网站&#xff0c;很多人问是怎么做的&#xff0c;今天就来写一篇教程吧。 全部干货&#xff0c;看完绝对能成功搭建自己的网站&#xff01;&#xff08;还不…...

Vue中<style scoped>与<style module>的深入解析与应用

在Vue开发中&#xff0c;样式管理是一个重要的环节。Vue提供了多种方式来帮助开发者更有效地管理组件样式&#xff0c;其中<style scoped>和<style module>是两个非常实用的特性。本文将深入探讨这两个属性的作用、原理以及使用场景&#xff0c;帮助读者更好地理解…...

Qt系列之数据库(二)代码篇

Qt 数据库开发是指在Qt框架下进行数据库操作的开发工作。Qt提供了一套强大的数据库模块&#xff0c;可以方便地与多种数据库进行交互&#xff0c;如SQLite、MySQL、PostgreSQL等。以下是一些关键点和步骤&#xff0c;帮助你进行Qt数据库开发&#xff1a; 1. 安装Qt数据库模块 …...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...