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

php redis分布式锁

一,概念

在PHP中实现分布式锁通常可以使用数据库、缓存系统(如Redis)或者其他中央存储系统来保证在分布式系统中的数据一致性与同步。秒杀下单、抢红包等等业务场景,都需要用到分布式锁。

在这里插入图片描述
常规方案大概有七中
方案一:SETNX + EXPIRE
方案二:SETNX + value值是(系统时间+过期时间)
方案三:使用Lua脚本(包含SETNX + EXPIRE两条指令)
方案四:SET的扩展命令(SET EX PX NX)
方案五:SET EX PX NX + 校验唯一随机值,再释放锁
方案六: 开源框架~Redisson
方案七:多机实现的分布式锁Redlock
这里我采用方案三,加锁和根据判断解锁都需要保持原子性,所以使用Lua脚本

二、代码

<?phpclass RedisLock
{private $redis;private $lockKey;public function __construct($lockKey){$this->redis = new Redis();$this->redis->connect('127.0.0.1', 6379);$this->lockKey = $lockKey;}public function acquireLock(){// 设置锁的超时时间,防止死锁(在删除锁的时候有可能服务挂了,那这个锁就成了死锁,设置过期时间可以防止死锁)$expire = 10;// 生成一个唯一的标识符(可能会出现线程A代码未执行完,锁已经过期,这时候另外一个线程B就能拿到了锁,这时线程A执行完毕删除锁,如果没有当前线程唯一标识就会删除掉B已经拿到的锁)$identifier = uniqid();while (!$this->redis->set($this->lockKey, $identifier, ['NX', 'EX' => $expire])) {// 如果设置失败,等待一段时间后重试usleep(1000);}return $identifier;}public function releaseLock($identifier){// 释放锁,检查标识符是否匹配,确保只有持有锁的请求才能释放锁//这里的判断和删除锁需要保持原子性,所以使用Lua脚本来删除if ($this->redis->eval("if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end", [$this->lockKey, $identifier], 1)) {return true;}return false;}
}// 示例用法
$lock = new RedisLock('my_resource');// 尝试获取锁
$identifier = $lock->acquireLock();if ($identifier) {// 成功获取锁,执行需要同步的操作// 释放锁$lock->releaseLock($identifier);
} else {// 获取锁失败,处理冲突或重试逻辑echo "Failed to acquire lock\n";
}

相关文章:

php redis分布式锁

一&#xff0c;概念 在PHP中实现分布式锁通常可以使用数据库、缓存系统&#xff08;如Redis&#xff09;或者其他中央存储系统来保证在分布式系统中的数据一致性与同步。秒杀下单、抢红包等等业务场景&#xff0c;都需要用到分布式锁。 常规方案大概有七中 方案一&#xff1a;…...

kotlin 中的布尔

1、kotlin中内置的Boolean类型&#xff0c;可以有true与false两个值的布尔对象。 布尔值的内置运算有&#xff08;跟很多语言如java、js一摸一样&#xff09;&#xff1a; ||——逻辑或&&——逻辑与!——逻辑非 fun main() {val a: Boolean trueval b: Boolean fa…...

有哪些ai聊天推荐?简单分享三款

有哪些ai聊天推荐&#xff1f;在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;聊天软件已经成为我们日常生活中不可或缺的一部分。无论是与朋友、家人还是同事交流&#xff0c;这些智能聊天软件都能为我们提供极大的便利。那么&#xff0c;市面上有哪些值得推…...

Python第二语言(十、Python面向对象(上))

目录 1. 标记变量的基础类型 2. 初识对象 2.1 使用对象组织数据 3. 成员变量 3.1 类和类成员的定义 3.2 成员变量和成员方法使用 3.3 成员方法的定义语句 4. 类和对象class Clock: def ring(self): 4.1 创建类对象的语法&#xff1a;对象名 类名称() 4.2 用生活中的…...

SolidWorks 2016 SP5安装教程

软件介绍 Solidworks软件功能强大&#xff0c;组件繁多。 Solidworks有功能强大、易学易用和技术创新三大特点&#xff0c;这使得SolidWorks 成为领先的、主流的三维CAD解决方案。 SolidWorks 能够提供不同的设计方案、减少设计过程中的错误以及提高产品质量。SolidWorks 不仅…...

为什么高考志愿只选计算机专业?

刚刚高考结束&#xff0c;不知道各位学弟学妹考的怎么样啊&#xff1f; 高考毕竟是对十二年寒窗苦读的评判&#xff0c;也是很多人改变命运的机会。很多同学每天等待出分的过程很煎熬&#xff0c;既吃不好也玩不好&#xff08;os&#xff1a;这种同学还挺多的&#xff09;。 但…...

GPT大模型微调-提高垂直领域回答质量

微调一个大模型并测试微调后的效果是一个很好的学习实践。下面是一个逐步指导,帮助你使用一个较小的预训练大模型进行微调,并测试其效果。我们将使用 Hugging Face 的 Transformers 库和一个较小的预训练模型,如 DistilBERT。这个库非常流行且易于使用。 实现步骤 步骤 1:…...

全网首发-Docker被封后的代理设置教程

最近上交、科大以及阿里的一些docker镜像&#xff0c;好像都因为不可控力导致无法访问。 所以&#xff0c;之前好多正常的一些镜像的打包都会报错&#xff1a; 比如&#xff1a; #1 [internall load build definition from Dockerfile#1transferring dockerfile:972B done#1 D…...

代码随想录算法训练营第五十七天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

代码随想录算法训练营第五十七天 1143.最长公共子序列 题目链接&#xff1a;1143.最长公共子序列 确定dp数组以及下标的含义&#xff1a;dp[i][j] &#xff1a;以下标i - 1为结尾的text1&#xff0c;和以下标j - 1为结尾的text2&#xff0c;最长重复子数组长度为dp[i][j]确…...

RocketMQ事务性消息

RocketMQ事务性消息是一定能保证消息发送成功的 事务消息发送步骤&#xff1a; &#xff08;1&#xff09;发送方将半事务消息发送至RocketMQ服务端。 &#xff08;2&#xff09;RocketMQ服务端将消息持久化之后&#xff0c;向发送方返回ack确认消息已经发送成功。由于消息为…...

mysql (事物)

一.什么是事物 事物是一组操作的集合&#xff0c;不可分割的工作单位&#xff0c;事物会把所有的操作当作一个整体一起向系统提交或撤销操作请求&#xff0c;就是这些操作要么一起成功要么一起失败。 二.事物操作 &#xff08;这个就是一个理解&#xff09; 1.事务特性 原子性…...

kotlin 中的字符串

一、字符类访问 1、字符串的访问跟js一样&#xff0c;可以使用索引来访问或者直接循环。 fun main() {val a: String "2024"// 方式一&#xff1a;for (item in a) {println(item) // 输出每一个字符}// 方式二&#xff1a;println("${a[0]}, ${a[1]}, ${a[2…...

网站线上模板建设的优缺点

优点&#xff1a; 1.搭建的时间短&#xff0c;在线建站&#xff0c;只需要登录注册然后选择网站模板创建网站即可管理自己的网站后台&#xff0c;就几步操作就可以实现。 2.网站出错率少&#xff0c;因为有很多用户在使用&#xff0c;前期所报出来的问题就已经一一…...

哲学家进餐问题

1.最多允许四个哲学家同时进餐&#xff0c;保证有一个筷子是空闲的&#xff0c;从而保证能有有一个哲学家成功进餐&#xff0c;而不导致死锁 semaphore chopstick[5] {1, 1, 1, 1, 1}, mutex4; Pi(){do{think...P(mutex);P(chopstick[i]);P(chopstick[(i1)%5);eat...V(mutex)…...

无人机遥感在农林信息提取中的实现方法与GIS融合应用

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…...

联想测开一面(电话面试)笔试60%

联想测开一面&#xff08;电话面试&#xff09;笔试60% 3.21 无自我介绍 基本问项目&#xff0c;问实习 对python自动化测试了解多少 讲一下python中打包和解包的概念 学校无测试相关课程&#xff0c;平时用什么平台去学习的 计算机底层实现原理简要说说&#xff08;软硬结合&…...

【python】tkinter GUI开发: Button和Entry的应用实战探索

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

sm2证书生成(openssl3.0)

1、下载安装包 https://www.openssl.org/source/openssl-3.0.14.tar.gz 2、解压到指定位置 /appserver/openssl-3.0.14 3、安装依赖包 yum -y install gcc perl make zlib-devel perl-CPAN 4、编译 ./config shared --prefix/appserver/SM make depend make make install 5…...

java计算年化利率

接了业务需求需要计算年化利率&#xff0c; 公式定义&#xff1a; IRR计算 在计算 IRR 时&#xff0c;我们希望找到一个折现率r&#xff0c;使得净现值&#xff08;NPV&#xff09;为零。NPV 函数定义如下&#xff1a; NPV ∑ t 0 n C t ( 1 r ) t \text{NPV} \sum_{t0}…...

深入理解ChatGPT工作原理

在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术的飞速发展让机器能够更加自然和人类进行交流。OpenAI的ChatGPT作为当前最受关注的NLP模型之一&#xff0c;其出色的对话能力引起了业界和学术界的广泛关注。本文将深入探讨ChatGPT的工作原理&#xff0…...

基于SpringBoot的B2C生鲜电商平台毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Vue框架的B2C生鲜电商平台以解决当前生鲜电商领域存在的核心问题包括供应链管理效率低下导致的商品损耗率居高不下用户端体…...

AI工具搭建自动化视频生成Quick Sync

# Quick Sync&#xff1a;AI驱动的自动化视频生成技术实战解析 前阵子团队接了个批量短视频生成的项目&#xff0c;要在短时间内产出数百条产品演示视频。一开始想着一个个用Premiere剪&#xff0c;但算算时间&#xff0c;光是渲染就够呛。后来试用了几种自动化方案&#xff0c…...

AI Agent(智能体)的输出格式应该从 Markdown 转向 HTML吗?

在近期&#xff08;2026年5月&#xff09;的技术圈和AI社区引发了非常热烈的讨论。提出这个观点的是 Anthropic&#xff08;Claude背后的公司&#xff09;负责 Claude Code 团队的工程师 Thariq Shihipar&#xff0c;他最近发表了一篇题为《使用 Claude Code&#xff1a;HTML 极…...

基于ResearchClaw构建学术论文监控爬虫:配置驱动与模块化设计实践

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫“ResearchClaw”。这名字听起来就有点意思&#xff0c;直译过来是“研究之爪”&#xff0c;我第一眼看到这个标题&#xff0c;就感觉它应该是个能帮你从互联网上“抓取”研究资料的工具。果不其然&#x…...

不可错过的AI教材写作攻略,借助工具轻松达成低查重目标

教材编写中的挑战与AI工具的解决方案 在教材编写的过程中&#xff0c;确保原创性与合规性之间的平衡是一项关键任务。创作者在借鉴优秀教材的同时&#xff0c;又担心查重率可能会超标&#xff1b;而在尝试自主创作时&#xff0c;又容易面临逻辑不够严密或内容不准确的问题。更…...

硬件工程师如何高效阅读技术博客:从EDA工具到IP核的实战学习指南

1. 从“本周最佳”到深度解析&#xff1a;一位硬件工程师的EDA与IP博客阅读笔记每周五下午&#xff0c;当项目代码编译的进度条缓慢爬升时&#xff0c;我总会习惯性地打开几个固定的书签&#xff0c;快速浏览过去一周里全球同行们又分享了哪些新想法、新工具或是踩了哪些新坑。…...

自建S3兼容对象存储:Shebe部署、集成与运维全指南

1. 项目概述&#xff1a;一个面向开发者的开源文件存储与分发解决方案最近在折腾个人项目&#xff0c;需要处理用户上传的图片、文档&#xff0c;还要能快速分发到前端展示。自己搭存储服务吧&#xff0c;从对象存储到CDN&#xff0c;配置起来一堆事儿&#xff0c;用第三方云服…...

Proteus仿真新手必看:从电容单位到LCD1602,这份常用元器件清单帮你快速上手

Proteus仿真实战指南&#xff1a;从零搭建你的第一个电子电路 刚接触Proteus的电子爱好者们&#xff0c;面对软件里密密麻麻的元器件库&#xff0c;是不是有种"大海捞针"的感觉&#xff1f;别担心&#xff0c;这份指南将带你快速锁定核心元器件&#xff0c;用最直接的…...

2026年电力电缆品牌梳理多维度适配项目选型需求

随着双碳目标落地与电力基础设施完善&#xff0c;电力电缆作为电力传输的重要载体&#xff0c;市场需求持续释放&#xff0c;产品向高安全、长寿命、广适配方向发展。本文基于市场应用与企业实力&#xff0c;整理电力电缆品牌信息&#xff0c;助力项目合理选型。一、2026年电力…...

程序员裸辞转行网络安全,我只用了 90 天

程序员如何90天成功转行黑客&#xff08;网络安全&#xff09;&#xff1f; 有人说&#xff1a;”黑客到底比程序员高在哪&#xff0c;为什么很多人开始转行了“其实黑客都是程序员&#xff0c;但是并不是所有的程序员都是黑客. 从企业和社会需求来看&#xff0c;现在真不缺程…...