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

pig Cloud中分布式锁的使用(setIfAbsent)

分布式锁实现解析(仅供参考-基本使用是够的)

特性本代码实现方式
互斥性使用 setIfAbsent(SETNX 命令)保证
防死锁通过设置过期时间(lockTimeout)保证
释放锁的安全性通过校验 lockValue 防止误删
锁的自动续期❌ 未实现
集群容错❌ 单节点模式,无容错
1. 锁核心机制
String lockValue = UUID.randomUUID().toString();
String lockKey = TaskLockKeyEnum.SAVE_MONTH_HOURS_EXCEL.getKey();
long lockTimeout = saveExcelConfig.getLockTimeout();// 1. 获取锁(SETNX + 过期时间)
if (redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, lockTimeout, TimeUnit.MINUTES)) {try {// 2. 执行业务逻辑jjbHandoverLogService.uploadMonthHoursExcel(yearMonth);} finally {// 3. 释放锁(先校验值再删除)if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) {redisTemplate.delete(lockKey);}}
}

  • 原子性操作setIfAbsent 实现原子性操作(等价于 Redis 的 SET key value NX PX 命令)
  • 锁标识:使用 UUID 生成唯一值,避免不同节点冲突
  • 超时机制:通过 lockTimeout 设置自动过期时间(单位:分钟),防止死锁
  • 键管理:枚举 TaskLockKeyEnum 统一管理锁键名
2. 锁释放逻辑
finally {
// 释放锁,确保即使任务执行异常也能释放锁if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) {redisTemplate.delete(lockKey);}
}

  • 值校验释放:比较当前锁值是否与初始值一致
  • 防误删设计:确保只释放当前节点持有的锁
  • finally 保障:异常情况下仍执行释放操作

典型应用场景:集群环境下定时任务的精确调度,如报表生成、数据归档等需要全局唯一执行的操作。

分布式锁实现解析

1. 锁核心机制
String lockValue = UUID.randomUUID().toString();
String lockKey = TaskLockKeyEnum.SAVE_MONTH_HOURS_EXCEL.getKey();
long lockTimeout = saveExcelConfig.getLockTimeout();if (redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, lockTimeout, TimeUnit.MINUTES)) {// 获取锁成功
} else {// 获取锁失败
}

  • 原子性操作setIfAbsent 实现原子性操作(等价于 Redis 的 SET key value NX PX 命令)
  • 锁标识:使用 UUID 生成唯一值,避免不同节点冲突
  • 超时机制:通过 lockTimeout 设置自动过期时间(单位:分钟),防止死锁
  • 键管理:枚举 TaskLockKeyEnum 统一管理锁键名
2. 锁释放逻辑
finally {if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) {redisTemplate.delete(lockKey);}
}

  • 值校验释放:比较当前锁值是否与初始值一致
  • 防误删设计:确保只释放当前节点持有的锁
  • finally 保障:异常情况下仍执行释放操作
3. 任务执行流程
graph TD
A[定时任务触发] --> B{获取分布式锁}
B -- 成功 --> C[检查任务开关]
B -- 失败 --> D[记录跳过日志]
C -- 开启 --> E[执行Excel导出]
E --> F[释放锁]
C -- 关闭 --> G[结束]

4. 关键特性
  1. 配置驱动

    # 示例配置
    saveExcel.lockTimeout=30               # 锁超时30分钟
    

典型应用场景:集群环境下定时任务的精确调度,如报表生成、数据归档等需要全局唯一执行的操作。

http://www.lryc.cn/news/606475.html

相关文章:

  • QT聊天项目DAY17
  • LeetCode 85:最大矩形
  • Shader开发(五)什么是渲染管线
  • Flutter兼容的iOS的最低版本号
  • 链特异性文库是什么?为什么它在转录组测序中越来越重要?
  • 【普中STM32精灵开发攻略】--第 2 章 开发板功能及使用介绍
  • 浅谈“压敏电阻”
  • 基于单片机智能油烟机设计/厨房排烟系统设计
  • 开发避坑短篇(12):达梦数据库TIMESTAMP字段日期区间查询实现方案
  • 快速搭建Java服务指南
  • 网站技术攻坚与Bug围剿手记
  • 环境配置·mmsegmentation和mmcv的安装
  • 【11】大恒相机SDK C++开发 ——原图像数据IFrameData内存中上下颠倒,怎么裁剪ROI 实时显示在pictureBox中
  • PostGIS面试题及详细答案120道之 (061-070 )
  • sqli-labs靶场Less24
  • 网络基础——路由控制
  • 逻辑回归算法基础介绍,简单的二分类三分类实例
  • 异常检测:算法分类及经典模型概览
  • npm 设置国内镜像源
  • 正点原子 ATK-BLE04 、ATK-BLE05 蓝牙模块学习使用
  • Motif技术团队:利用行为序列预测模型进行因果推断的案例(二)
  • 嵌入式第十六课!!!结构体与共用体
  • 【Python修仙编程】(二) Python3灵源初探(9)
  • 7.31IO进程线程——标准IO函数
  • 在window中安装swow体验php协程
  • 【07】大恒相机SDK C#开发 —— 相机IO触发采集与信号输出
  • 2025年IntelliJ IDEA最新下载、安装教程,附详细图文
  • 最新PS 2025安装包下载与安装教程(Adobe Photoshop 2025 )
  • Linux731 shell工具;[]字符
  • imx6ull-驱动开发篇5——新字符设备驱动实验