PHP批量操作加锁

  • 对于批量操作进行加锁,防止重复提交和数据库冲突

  • register_shutdown_function() 函数,register_shutdown_function 用于注册一个在脚本执行完毕或发生致命错误时调用的函数。这意味着 register_shutdown_function 注册的函数会在脚本的正常执行流程结束后调用,而不是立即执行。代码的执行顺序如下:

    1. 注册一个 shutdown 函数,该函数在脚本结束时调用 LockService::remove($lockKey)。
    2. 执行 $value = 1;。
    3. 脚本继续执行后续的代码。
    4. 当脚本执行完毕或发生致命错误时,调用注册的 shutdown 函数。

$lockKey = 'store:pop:plant:operation'.$storeId;
//判断锁是否存在
if (LockService::has($lockKey, 5)) {$this->error('正在处理,请勿重复提交');
}
//register_shutdown_function
register_shutdown_function(function ($lockKey) {LockService::remove($lockKey);
}, $lockKey);

LockService服务类

<?phpnamespace app\common\service;class LockService
{/*** 判断是否有锁* @param string $key        锁Key* @param int    $ttl        锁时间(秒)* @param bool   $refreshTtl 是否重置锁时间* @return bool* @throws \RedisException*/public static function has(string $key, int $ttl = 5, bool $refreshTtl = true): bool{$res = RedisService::handle()->incr(self::buildKey($key));if ($refreshTtl || $res === 1) {RedisService::handle()->expireAt(self::buildKey($key), time() + $ttl);}return $res !== 1;}/*** 移除锁* @param string $key* @return void* @throws \RedisException*/public static function remove(string $key){RedisService::handle()->del(self::buildKey($key));}/*** 获取锁定次数* @param string $key* @return false|mixed|\Redis|string* @throws \RedisException*/public static function times(string $key){return RedisService::handle()->get(self::buildKey($key));}private static function buildKey(string $key): string{return 'lock:' . $key;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

利用寄存器方式,点亮led3最小板

作业:利用寄存器方式,点亮led3小灯 1.通过观察原理图, led3, 是PA8, 一段接3.3v, 一端接io口, 所以PA8端口输出低电平, 就可以让小灯点亮了 2.利用keil创建最小工程 点击跳转博客 3.按照库函数的配置方式 #include "stdint.h" #include "stm32f10x.h" …

Helius:从数据出发,衡量 Solana 的真实去中心化程度

撰文&#xff1a;Lostin&#xff0c;Helius 编译&#xff1a;Yangz&#xff0c;Techub News 摘要 截至 Epoch 685&#xff0c;Solana 有 4514 个节点&#xff0c;包括 1414 个验证者和 3100 个 RPC。没有哪个验证者控制的质押份额超过 3.2%。 中本聪系数&#xff08;NC&#…

SpringBoot 增量部署发布(第2版)

一、背景介绍 书接上一篇《SpringBoot 增量部署发布_springboot增量部署-CSDN博客》&#xff0c;上一篇内容实现了将静态资源与jar分离&#xff0c;但是即使是打包成**-exec.jar&#xff0c;解压jar文件&#xff0c;可以看到里面包含了static&#xff0c;resource目录&#xf…

一篇保姆式centos/ubantu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubantu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

结构体的深入学习:内存对齐等

结构体的创建 //结构体类型的定义//学生 struct Stu {//学生的相关属性char name[20];int age; };结构体变量的创建 struct Stu {//学生的相关属性char name[20];int age; }s1, s2;//s1&#xff0c;s2全局变量int main() {struct Stu s3;//s3是局部变量return 0; }匿名结构体…

QString 转 char*问题与方法(const_cast的使用问题)

1、背景:今天有QString的变量&#xff0c;将QString的值传递给void func(char * ptr)&#xff0c;于是就有了类似下面这一段离谱的代码 当时我还在想为什么var的值为空了&#xff0c;为什么呢。 2、原因:就是因为右边函数返回的是一个临时指针对象&#xff0c;给到了右边&…

【Redis】Redis实现的消息队列

一、用list实现【这是数据类型所以支持持久化】 消息基于redis存储不会因为受jvm内存上限的限制&#xff0c;支持消息的有序性&#xff0c;基于redis的持久化机制&#xff0c;只支持单一消费者订阅&#xff0c;无法避免消息丢失。 二、用PubSub【这不是数据类型&#xff0c;是…

PHP开发全新UI多语言多商户跨境商城源码、支持一键铺货、一键下单

商家可在平台产品库选品&#xff0c;一键铺货到自己商店&#xff0c;用户下单后&#xff0c;商家提交订单给平台&#xff0c;扣除商家供货价所需余额&#xff0c;提交后由平台发货&#xff0c;收货后订单金额结算给商家. 源码开源完整&#xff0c;一切能跑通的逻辑流程都可以二…

Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization, NGO&#xff09;是一种新颖的群智能优化算法&#xff0c;灵感源自北方苍鹰捕食时的策略。该算法通过模拟苍鹰的搜寻、接近和捕捉猎物的行为模式&am…

【TQ2440】01 ADS1.2 安装

TQ2440是一款基于Samsung S3C2440处理器的ARM9开发板&#xff0c;广泛应用于嵌入式系统学习和开发 TQ2440 开发配套资料 https://pan.baidu.com/s/1cMMK9HQdq1Ou8-K9fnw-DA?pwd5y5r ADS1.2安装包链接&#xff1a;https://pan.baidu.com/s/1BBJb4jYKLOYXIMD86WCycA?pwdf7zr 1、…

不完全微分PID控制算法

不完全微分PID控制算法是一种改进的PID控制方法&#xff0c;主要针对PID控制中的微分环节对高频噪声敏感的问题。通过对微分项进行优化和改造&#xff0c;减少其对噪声的放大作用&#xff0c;同时保留对系统动态变化的响应能力。 不完全微分PID控制原理 不完全微分的核心思想是…

IntelliJ IDEA常用快捷键

文章目录 环境快捷键外观编辑移动光标提示查找Live Templates列操作调试运行 环境 Ubuntu 24.04.1IntelliJ IDEA 2024.1.6 快捷键 外观 Alt 1&#xff1a;打开/关闭“项目”窗口&#xff08;即左边的导航窗口&#xff09; Alt 4&#xff1a;打开/关闭“运行”窗口 Alt …

标题gitLab如何打标签

标题gitLab打标签 1、首先进入到项目里面&#xff0c;找到Repository下的Tages&#xff0c;点击进入 如果是还没有创建过标签&#xff0c;会提示如何用命令创建 git tag -a v1.4 -m "version 1.4"2、也可以直接在界面创建&#xff0c;点击new Tag按钮 3、填写标签…

C++AVL平衡树

1.AVL平衡树节点定义 每一个节点都配左右孩子和父节点&#xff0c;以及平衡因子和其所对应的值。 template<class K, class V> struct AVLTreeNode {// 需要parent指针&#xff0c;后续更新平衡因子可以看到pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTr…

Java进阶四-异常,File

异常 概念&#xff1a;代表程序出现的问题。 目的&#xff1a;程序出现了异常我们应该如何处理。 最高父类&#xff1a;Exception 异常分为两类 编译时异常&#xff1a;没有继承RuntimeException的异常,直接继承与Exception,编译阶段就会错误提示。运行时异常:RuntimeExc…

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣​ 其中&#xff0c; A 和 …

Stata17最新保姆级安装教程【附安装包】

文章目录 Stata介绍 Stata下载 Stata安装步骤 Stata介绍 Stata 是一套提供其使用者数据分析、数据管理以及绘制专业图表的完整及整合性统计软件。它提供许许多多功能&#xff0c;包含线性混合模型、均衡重复反复及多项式普罗比模式等。 Stata下载 Stata 64位下载链接&…

jenkins离线安装插件

Jenkins 在线安装插件失败 报错&#xff1a; Caused: java.io.IOException: Failed to load https://updates.jenkins.io/download/plugins/login-theme/244.vd67c77f0c4c8/login-theme.hpi to /var/jenkins_home/plugins/login-theme.jpi.tmpat hudson.model.UpdateCenter$Up…

人工智能学习——前言

一、概论理解 首先何为人工智能&#xff1f;简单一句人话就是&#xff1a;人工操纵搭建出来的智能学习模型 那我们要用它干什么&#xff1f;简单一句话就是&#xff1a;我们给出指令 ——> 得到想要的结果 最简单的生活例子来看&#xff1a;就好比小狗&#xff0c;我们让它…

C++11——异常

1.异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就会抛出异常&#xff0c;让函数的调用者处理这个错误 throw&#xff1a;当出现问题时&#xff0c;程序会抛出一个异常&#xff0c;通过 throw 来完成catch&#xff1a;catch 关键字捕获异…