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

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服务类

<?php

namespace 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.kler.cn/a/401840.html

相关文章:

  • 《网络风险及网络安全》培训总结
  • springBoot插件打包部署
  • 小鹏汽车嵌入式面试题及参考答案
  • elasticsearch是如何实现master选举的?
  • web——upload-labs——第十关——.空格.绕过
  • 在MATLAB中导入TXT文件的若干方法
  • CSP/信奥赛C++语法基础刷题训练(16):洛谷P5731:蛇形方阵
  • C++11——异常
  • 网络安全检测技术
  • python用哈希删除文件夹中重复的图片
  • linux配置动态ip
  • 网络--网络层协议--IP
  • ARM CCA机密计算安全模型之生态
  • hhdb数据库介绍(9-24)
  • SpringBoot 增量部署发布(第2版)
  • Leetcode 寻找峰值
  • flink StreamGraph 构造flink任务
  • Blender vs 3dMax谁才是3D软件的未来?
  • 【Unity踩坑】Unity编辑器占用资源过高
  • SSH公钥有什么用?Windows 11操作系统上如何获取SSH公钥
  • 厦门凯酷全科技有限公司正规吗?
  • 【设计模式】行为型模式(三):责任链模式、状态模式
  • 【Python模拟websocket登陆-拆包封包】
  • 优化装配,提升品质:虚拟装配在汽车制造中的关键作用
  • 悬浮框前端效果查看与造数
  • 硬件工程师之电子元器件—二极管(10)之可变电容和TVS二极管