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

使用php和redis实现分布式锁

实现分布式锁是在分布式环境中确保资源独占性的重要手段。在这里,我将使用 PHP 和 Redis 来展示如何实现基于 Redis 的分布式锁。

首先,我们需要使用 Redis 的 SET 指令来尝试获取锁,并设置一个过期时间,确保锁不会永久存在。在 Redis 中,我们可以利用 SET 指令的特性,例如在给定的键不存在时设置键的值并设置过期时间来实现分布式锁。

下面是一个使用 PHP 和 Redis 实现分布式锁的示例:

<?phpclass RedisLock
{private $redis;private $lockKey;private $timeout; // 锁的超时时间,单位:秒public function __construct($redis, $lockKey, $timeout = 10){$this->redis = $redis;$this->lockKey = $lockKey;$this->timeout = $timeout;}public function acquireLock(){$startTime = time();$expiry = $startTime + $this->timeout + 1; // 锁的超时时间加一,确保不会因为客户端时间偏差导致误判while (time() < $expiry) {$result = $this->redis->set($this->lockKey, 1, ['NX', 'EX' => $this->timeout]);if ($result === true) {return true; // 获取锁成功}usleep(10000); // 等待10毫秒后重试}return false; // 获取锁超时}public function releaseLock(){$this->redis->del($this->lockKey);}
}// 使用示例
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);$lockKey = 'my_distributed_lock';
$lock = new RedisLock($redis, $lockKey);if ($lock->acquireLock()) {try {// 在获取到锁之后,执行需要加锁的代码块echo "Lock acquired! Performing critical section...\n";sleep(5); // 模拟需要加锁保护的代码echo "Critical section complete.\n";} finally {$lock->releaseLock(); // 释放锁}
} else {echo "Failed to acquire lock within specified timeout.\n";
}$redis->close();

在上面的示例中,我们首先创建了一个 RedisLock 类,该类负责封装了获取锁和释放锁的逻辑。在主程序中,我们实例化 RedisLock 对象,并调用 acquireLock 方法来尝试获取锁。如果获取锁成功,则执行需要加锁保护的关键代码块;如果获取锁失败(超时),则输出获取锁失败的信息。

在关键代码块执行完成后,我们使用 finally 块确保无论如何都会释放锁,调用 releaseLock 方法来释放锁资源。

需要注意的是,在实际应用中,分布式锁的实现可能需要考虑更多的复杂性,例如处理锁的续约、处理死锁等情况。此外,Redis 本身提供了一些针对分布式锁的优化方案,例如使用 Redlock 算法来实现更加可靠的分布式锁,你可以根据具体需求来选择合适的方案。

更详细请看
https://blog.csdn.net/qq_42133326/article/details/136454740
https://www.cnblogs.com/phpphp/p/18091067

相关文章:

使用php和redis实现分布式锁

实现分布式锁是在分布式环境中确保资源独占性的重要手段。在这里&#xff0c;我将使用 PHP 和 Redis 来展示如何实现基于 Redis 的分布式锁。 首先&#xff0c;我们需要使用 Redis 的 SET 指令来尝试获取锁&#xff0c;并设置一个过期时间&#xff0c;确保锁不会永久存在。在 …...

大龄程序员是否要入职嵌入式python岗位?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 是否要做嵌入式 Python 取决于…...

STL—string类(1)

一、string类 1、为什么要学习string&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP&#xff08;面向对象…...

科技查新中化工领域查新点如何确立与提炼?案例讲解!

我国化工科技查新工作始于1985年&#xff0c;至今经历了30多年的发展。化工类课题包含化工、炼油、 冶金、能源、轻工、石化、环境、医药、环保和军工等&#xff0c; 具有物质种类繁多、制备工艺复杂等特点。因此&#xff0c;本文结合化工查新项目实例&#xff0c;总结提高化工…...

国网698.45报文解析工具

本文分享一个698.45协议的报文解析工具&#xff0c;此报文解析工具功能强大&#xff0c;可以解析多种国网数据协议。 下载链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主要界面如下&#xff1a; 本工具内置698.45数据协议&#xff0c; 即可调用word…...

留学资讯 | 2024英国学生签证申请需要满足哪些条件?

英国移民局于2020年9月10日发布了《移民规则变更声明: HC 707》&#xff0c;对学生签证制度进行了全面改革。该法案于2020年10月5日正式生效。根据此法案&#xff0c;新的学生签证——The Student and Child Student Routes学生和儿童学生路线&#xff0c;将替代原先的Tier 4学…...

Python 中的分步机器学习

1.安装 Python 和 SciPy 平台。 # Check the versions of libraries# Python version import sys print(Python: {}.format(sys.version)) # scipy import scipy print(scipy: {}.format(scipy.__version__)) # numpy import numpy print(numpy: {}.format(numpy.__version__)…...

C++错题集(持续更新ing)

Day 1 一、选择题 解析&#xff1a; 在数字不会溢出的前提下&#xff0c;对于正数和负数&#xff0c;有&#xff1a; 1&#xff09;左移n位&#xff0c;相当于操作数乘以2的n次方&#xff1b; 2&#xff09;右移n位&#xff0c;相当于操作数除以2的n次方。 解析&#xff1a…...

静态IP代理:网络世界的隐秘通道

在数字化时代&#xff0c;网络安全和隐私保护日益受到重视。静态IP代理作为一种网络服务&#xff0c;为用户提供了一个稳定且可预测的网络连接方式&#xff0c;同时保护了用户的在线身份。本文将从五个方面深入探讨静态IP代理的概念、优势、应用场景、技术实现以及选择时的考量…...

信号和槽的其他说明和优缺点

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、信号与槽的断开 二、使用Lambda 表达式定义槽函数 1、局部变量引入方式 [ ] 2、函数参数 &am…...

手工创建 kamailio database tables

有些场景可能kamdbctl create不好使&#xff0c;可能需要手工创建 kamailio database tables&#xff0c;可参考下面的命令序列&#xff1a; USE mysql # 删除之前创建的用户 SELECT user,host FROM user; DROP USER kamailio%; FLUSH PRIVILEGES; # 删除之前创建的数据库 DROP…...

SpringBoot接收参数的19种方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583...

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗&#xff1f;Disk Map for Mac来帮您轻松解决&#xff01;通过独特的TreeMap视觉显示技术&#xff0c;让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作&#xff0c;即可快速释放磁盘空间&#xff0c;让您的Mac更“轻”松。快来…...

【二叉树】(三)二叉树的基础修改构造及属性求解2

&#xff08;二&#xff09;二叉树的基础修改构造及属性求解2 二叉树的所有路径思路递归法迭代法 左叶子之和递归法迭代法 找树左下角的值递归法迭代法 路径总和从中序与后序遍历序列构造二叉树最大二叉树合并二叉树 二叉树的所有路径 力扣原题链接&#xff1a;257. 二叉树的所…...

PyCharm2024安装教程

PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多工具和功能来帮助开发者编写、调试和测试Python代码。以下是使用PyCharm的基本步骤&#xff1a; 安装PyCharm&#xff1a;首先&#xff0c;你需要从JetBrains官方网站下载并安装…...

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 ⭐️ 引言&#x1f3af; 变量提升(Hoisting)&#x1f47b; 暂时性死区&#xff08;Temporal Dead Zone, TDZ&#xff09;解释&#x1f4e6; var声明&#x1f512; let与const声明&#x1f4d6; 函数声明 与 函数表达式函数声…...

[Cesium]Cesium基础学习——Primitive

Cesium开发高级篇 | 01空间数据可视化之Primitive - 知乎 Primitive由两部分组成&#xff1a;几何体&#xff08;Geometry&#xff09;和外观&#xff08;Appearance&#xff09;。几何体定义了几何类型、位置和颜色&#xff0c;例如三角形、多边形、折线、点、标签等&#xff…...

java相等忽略音调

来自百度,亲测可用 java相等忽略音调 在Java中&#xff0c;如果你想比较两个字符串而忽略它们的音调符号&#xff0c;你可以使用java.text.Collator类来进行区域敏感的字符串比较。Collator类提供了根据特定区域的规则进行字符串比较的能力&#xff0c;可以设置忽略音调的选项…...

自养号测评实战指南:Shopee、Lazada销量翻倍不再是难题

对于速卖通、亚马逊、eBay、敦煌网、SHEIN、Lazada、虾皮等平台的卖家而言&#xff0c;提高店铺流量并转化为实际销量是共同追求的目标。在这个过程中&#xff0c;自养号进行产品测评显得尤为重要。通过精心策划和执行的测评活动&#xff0c;卖家不仅能够显著增加产品的销量&am…...

【Java开发面试系列】JVM相关面试题(精选)

【Java开发面试系列】JVM相关面试题&#xff08;精选&#xff09; 文章目录 【Java开发面试系列】JVM相关面试题&#xff08;精选&#xff09;前言一、JVM组成二、类加载器三、垃圾回收四、JVM实践&#xff08;调优&#xff09; &#x1f308;你好呀&#xff01;我是 山顶风景独…...

续航提升40%?EnergyStarX让Windows 11设备电量焦虑成为历史

续航提升40%&#xff1f;EnergyStarX让Windows 11设备电量焦虑成为历史 【免费下载链接】EnergyStarX &#x1f50b; Improve your Windows 11 devices battery life. A WinUI 3 GUI for https://github.com/imbushuo/EnergyStar. 项目地址: https://gitcode.com/gh_mirrors/…...

Unity UGUI实战:手把手教你打造一个可拖拽、可弯曲的UI连线组件(附完整源码)

Unity UGUI实战&#xff1a;打造可拖拽、可弯曲的智能连线系统 在游戏开发中&#xff0c;可视化连接系统是构建技能树、流程图、科技树等复杂UI结构的核心组件。传统实现往往局限于静态线条或简单的直线连接&#xff0c;缺乏交互性和动态美感。本文将带你从零构建一个支持实时拖…...

ProfControl V8的介绍 阵列生成

作者&#xff1a;刘凌波链接&#xff1a;环野电子, profcontrolhttp://oa.profcontrol.cn/teaching_V8-7926f783c6.html来源&#xff1a;ProfControl阵列生成ProfControl支持基于仿射变换的阵列快速生成方式&#xff0c;ProfControl支持对各种对象进行阵列生产&#xff08;包括…...

Llama-3.2V-11B-cot快速部署:Docker镜像开箱即用,5分钟启动视觉CoT服务

Llama-3.2V-11B-cot快速部署&#xff1a;Docker镜像开箱即用&#xff0c;5分钟启动视觉CoT服务 1. 项目概述 Llama-3.2V-11B-cot是一个支持系统性推理的视觉语言模型&#xff0c;基于LLaVA-CoT论文实现。这个模型能够理解图像内容并进行逐步推理&#xff0c;最终给出合理的结…...

StructBERT-WebUI部署案例:AI客服中台语义路由模块集成实践

StructBERT-WebUI部署案例&#xff1a;AI客服中台语义路由模块集成实践 1. 项目背景与价值 在现代AI客服系统中&#xff0c;语义理解是核心能力之一。当用户提出"我的订单怎么还没到"时&#xff0c;系统需要准确理解这其实是在询问"物流状态"&#xff0c…...

视频高清低延时直播/音视频点播/云点播/云直播EasyDSS在校园教育/K12教育等各场景中的应用介绍

在线教育的核心竞争力&#xff0c;归根结底在于教学体验的优劣&#xff0c;而视频技术作为线上教学的核心载体&#xff0c;直接决定了教学体验的上限。随着在线教育行业的快速迭代&#xff0c;学员对线上课堂的要求愈发严苛&#xff1a;不仅需要高清流畅、稳定无卡顿的音视频传…...

如何在树莓派上用TinyProxy搭建轻量级HTTP代理(附性能优化技巧)

树莓派上部署TinyProxy的工程实践与深度调优指南 当你在咖啡厅用树莓派搭建的微型服务器调试物联网设备时&#xff0c;突然发现所有外网请求都需要经过代理——这就是TinyProxy在嵌入式场景下的典型应用。不同于x86服务器的部署&#xff0c;在ARM架构的树莓派上运行代理服务需要…...

Claude Code桌面控制实战:macOS开启Computer Use指南

Claude Code 的 computer use 功能&#xff0c;是 2026 年 3 月正式上线的原生 macOS 桌面控制能力&#xff0c;让 Claude 可以打开 App、点击、输入、截图&#xff0c;直接在你的真实桌面上完成 GUI 任务。它以内置 MCP 服务器的形式集成到 Claude Code CLI 中&#xff0c;通过…...

基于python的民宿预定管理系统设计与实现j470j

目录同行可拿货,招校园代理 ,本人源头供货商功能需求分析用户端功能房东端功能管理员端功能技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能需求分析 民宿…...

3个核心技巧:快速掌握免费在线PPT编辑器PPTist的创作秘诀

3个核心技巧&#xff1a;快速掌握免费在线PPT编辑器PPTist的创作秘诀 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing…...