PHP项目添加分布式锁,这里是ThinkPHP8框架实现分布式锁

背景:公司旧项目,最初访问量不多,单机部署的。后来,访问量上来了,有阵子很卡,公司决定横向扩展,后端代码部署了三台服务器。部署调整后,有用户反馈,一个订单支付了三次。

问题分析:
通过对项目日志分析,问题应该出现在,使用Redis做分布式锁,没有做到原子性操作。判断键是否存在和设置键及有效期是分两步来的,服务器卡的时候,放大了这两步操作的时间,导致了问题产生。

问题解决:
得优化这部分代码,得采用Redis调用lua脚本,实现操作的原子性。查了各种博客及Redis官方文档,推荐了ronnylt/redlock-php这个扩展,进来发现这个扩展比较老旧了,支持PHP版本太老了。
在这里插入图片描述
通过搜索redlock-php发现signe/redlock-php扩展应该可以满足公司项目需求。
在这里插入图片描述

PHP分布式测试:
本地部署了两套PHP接口代码,环境如下:

ThinkPHP8.0
PHP8
composer require ronnylt/redlock-php

测试接口代码如下:

<?php
declare (strict_types=1);namespace app\controller;use RedLock\RedLock;class Index
{public function index(){$servers = [['127.0.0.1', 6379, 0.01],];$redLock = new RedLock($servers);$lock = $redLock->lock('my_resource_name', 200000);// $lock是一个数组,说明抢到临界资源,可以执行业务;上锁失败是falseif ($lock) {// 执行业务逻辑echo "执行业务代码...<br/>";// 业务执行完毕,可以进行解锁操作$redLock->unlock($lock);} else {echo "未抢到临界资源,继续等待...<br/>";}}
}

测试时注释了解锁时间,把加锁时间设置成了200秒,测试结果符合预期,下面是测试过程截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
符合预期后,把这扩展安装到现有项目,优化了现有代码,测试上线,这里记录下,防止下回碰到类似问题又去从零梳理解决此类问题。

小结下流程:
1、PHP项目安装扩展

composer require ronnylt/redlock-php

2、分布式锁实现代码示例

<?php
declare (strict_types=1);namespace app\controller;use RedLock\RedLock;class Index
{public function index(){$servers = [['127.0.0.1', 6379, 0.01],];$redLock = new RedLock($servers);$lock = $redLock->lock('my_resource_name', 200000);// $lock是一个数组,说明抢到临界资源,可以执行业务;上锁失败是falseif ($lock) {// 执行业务逻辑echo "执行业务代码...<br/>";// 业务执行完毕,可以进行解锁操作// $redLock->unlock($lock);} else {echo "未抢到临界资源,继续等待...<br/>";}}
}

概念补充:

分布式锁:

保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行。

实现分布式锁一般有三种实现方式:

1. 数据库乐观锁
2. 基于Redis的分布式锁
3. 基于Zookeeper的分布式锁

确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:

1. 互斥性。在任意时刻,只有一个客户端能持有锁。2. 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。3. 安全性。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了,即不能误解锁。4. 容错性。只要大多数Redis节点正常运行,客户端就能够获取和释放锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理--http

目录 一、 DNS&#xff08;应用层协议&#xff09; 1、域名概念 2、维护ip地址和域名之间的映射&#xff08;域名解析系统&#xff09; 3、DNS系统&#xff08;服务器&#xff09; 4、如何解决DNS服务器高并发问题 二、HTTP&#xff08;应用层协议&#xff09; 1、htt…

win10安装ssh服务

前置条件&#xff1a; 远程虚拟机&#xff0c;防火墙关闭&#xff0c;本地主机与虚拟机互相可以ping通 虚拟机是win10专业版本 操作步骤&#xff1a; 1、搜索框搜索“Windows PowerShell”并以管理员身份运行 2、输入如下代码&#xff0c;检查本地是否有ssh服务&#xff0c…

【Docker】网络模式➕自定义网络

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.Docker网络模式的介绍 二. 网桥模…

Linux内核架构和工作原理详解(二)

Linux内核体系结构简析简析 图1 Linux系统层次结构 最上面是用户&#xff08;或应用程序&#xff09;空间。这是用户应用程序执行的地方。用户空间之下是内核空间&#xff0c;Linux 内核正是位于这里。GNU C Library &#xff08;glibc&#xff09;也在这里。它提供了连接内核…

【JVM】类的生命周期

目录 类的生命周期 加载阶段 连接阶段 初始化阶段 类的使用阶段 类的加载阶段 类的生命周期 加载阶段 在加载阶段&#xff0c;类加载器首先会通过一个类的全限定名来获取定义此类的二进制字节流。这个步骤主要是将整个Class 文件解析成二进制流。 &#xff08;全限定名是…

海外代理IP怎么用?常见使用问题及解决方案

海外代理IP是指提供全球范围内的代理服务器&#xff0c;代理服务器充当IP与目标网站之间的中介&#xff0c;可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中&#xff0c;用户可能会遇到各种挑战&#xff0c;如连接问题、速度慢等。理解这些问题的原因并…

HCIP第一次练习 -- RIP复习实验

要求&#xff1a; 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇&#xff08;Shin Tae-yong&#xff09;教练是足球界的传奇人物&#xff0c;他来到 The Sandbox&#xff0c;推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练&#xff0c;他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时&#xff0c;我们有时需要为矢量边界添加晕线&#xff0c;今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本&#xff1a;ArcMap10.4.1 方法一&#xff1a;制作多环缓冲区 工具路径&#xff1a;Analysis Tools-Proximity-Mutiple Ring Buffer 思…

前后端跨域问题

告别烦恼&#xff0c;彻底解决跨域问题的终极指南-chrome的安全进阶之路_chrom 强制跨域-CSDN博客

在linux安装LAStools

LAStools下载&#xff1a; https://github.com/LAStools/LAStools/releases 编译安装&#xff1a; # 设置安装路径 cmake -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/LAStools-2.0.2/build cmake . cmake --build . make install编译后的库&#xff1a;

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

node版本过高与node-sass不兼容问题

第一步&#xff1a;安装yarn 安装cnpm 第二步&#xff1a;yarn install 这一步可能会出现node版本过高报错 yarn config set ignore-engines true 执行 自动补充兼容命令 然后重新yarn install 出现报错&#xff1a; 第三步&#xff1a;使用cnpm 单独安装 cnpm install node-…

Acrel-1000安科瑞变电站综合自动化系统选型与应用

摘 要&#xff1a;变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计&#xff0c;利用先进的计算机技术、通信技术、信号处理技术&#xff0c;实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。为…

【Docker】网络配置的三种方式

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③ 介绍运算符重载赋值运算符重载运算符重载const 在学习C语言时&#xff0c;我们首先接触的就是变量&#xff0c;再深入学习&#xff0c;我们可以利用运算符对变量进行操作&#xff0c;当我们使用C编写程序时&#xff0c;经常会遇到一些需要对特殊的例如自定义数据类型…

WEB 3D技术 three.js 3D贺卡(2) 加入天空与水面效果

上文 WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境 我们简单搭了一个贺卡雏形 然后 我们要引入一个hdr的一个天空的效果 所以 我们需要在代码中导入 RGBELoader //导入 RGBELoader hdr工具 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"…

文件加密怎么设置?文件工具哪个好用?

在使用电脑时&#xff0c;我们可以通过加密来保护电脑中的重要文件&#xff0c;那么&#xff0c;文件加密要怎么设置呢&#xff1f;下面我们就来了解一下。 文件夹加密超级大师 作为“加密大师”&#xff0c;文件夹加密超级大师支持文件加密功能&#xff0c;并提供了金钻加密和…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好&#xff0c;我是鱼皮&#xff0c;对不会前端的同学来说&#xff0c;开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单&#xff0c;使用框架&#xff0c;几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…