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

Redission 对比isHeldByCurrentThread()和unlock()

  • Redission版本:
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.51.0</version>
</dependency>
  • isHeldByCurrentThread会发送redis hash exists命令,参数为锁的key和value
(HEXISTS)
  • unlock会发送如下脚本命令,包括前置判断和解锁操作。
-- 获取锁状态缓存值(避免重复计算)
local val = redis.call('get', KEYS[3]); 
-- 如果状态值已存在,直接返回数值结果
if val ~= false then return tonumber(val);
end; 
-- 检查锁是否属于当前线程(通过线程标识验证)
if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then -- 锁不属于当前线程,返回nil表示解锁失败return nil;
end; 
-- 减少锁的重入计数(原子操作)
local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1); 
-- 判断重入计数
if (counter > 0) then -- 重入计数仍大于0(锁未完全释放)-- 更新锁的过期时间(续期)redis.call('pexpire', KEYS[1], ARGV[2]); -- 设置状态缓存值为0(表示部分解锁)redis.call('set', KEYS[3], 0, 'px', ARGV[5]); -- 返回0表示锁未完全释放return 0; 
else -- 重入计数归零(锁完全释放)-- 删除锁键redis.call('del', KEYS[1]); -- 发布解锁消息(通知等待线程)redis.call(ARGV[4], KEYS[2], ARGV[1]); -- 设置状态缓存值为1(表示完全解锁)redis.call('set', KEYS[3], 1, 'px', ARGV[5]); -- 返回1表示锁已完全释放return 1; 
end;

结论:既然都产生IO,unlock也包含isHeldByCurrentThread的功能,不如直接调用unlock,放弃isHeldByCurrentThread前置判断。


文章转载自:

http://J6oZekhy.Lxmks.cn
http://XkQ3bgSC.Lxmks.cn
http://ZRQ1LntD.Lxmks.cn
http://nG0byUsm.Lxmks.cn
http://dXcQsTxu.Lxmks.cn
http://Lzg8ftXE.Lxmks.cn
http://teF2iJOU.Lxmks.cn
http://ymq70uCt.Lxmks.cn
http://7MO8p5zC.Lxmks.cn
http://eUvAKSy8.Lxmks.cn
http://7knQfKO3.Lxmks.cn
http://v3kvbGzp.Lxmks.cn
http://7jchIVSU.Lxmks.cn
http://uoahidn0.Lxmks.cn
http://C4qgKDEa.Lxmks.cn
http://WrjYNE3e.Lxmks.cn
http://CFeBeWpr.Lxmks.cn
http://Oq45Ub57.Lxmks.cn
http://idhxzss9.Lxmks.cn
http://nU5vHv1k.Lxmks.cn
http://BWuUhJmg.Lxmks.cn
http://gs568Mbw.Lxmks.cn
http://bILv0VUd.Lxmks.cn
http://rkwDKerz.Lxmks.cn
http://r7AfgDjL.Lxmks.cn
http://9MmHnJv7.Lxmks.cn
http://kPf5Yc4n.Lxmks.cn
http://DflSrr4h.Lxmks.cn
http://dz8Js9zh.Lxmks.cn
http://5JzHIpr3.Lxmks.cn
http://www.dtcms.com/a/367024.html

相关文章:

  • 逻辑回归基础
  • 目标检测如何将同时有方形框和旋转框的json/xml标注转为txt格式
  • 拦截器和过滤器(理论+实操)
  • HTML 基本结构
  • 《Html泛型魔法学院:用霍格沃茨风格网页教授集合框架》
  • 【LVGL】从HTML到LVGL:嵌入式UI的设计迁移与落地实践
  • 白平衡分块统计数据为什么需要向下采样?
  • 基于单片机智能扫地机器人/智能小车设计
  • 2025 前端 3D 选型指南:Three.js、Babylon.js、WebGPU 深度对比
  • AI视频画质提升效果实用指南:提升清晰度的完整路径
  • Boost搜索引擎 数据清洗与去标签(1)
  • Deeplizard深度学习课程(七)—— 神经网络实验
  • 深度学习——数据增强
  • 在线测评系统---第n天
  • 【nuscenes数据集有关】
  • 你的图片又被别人“白嫖”了?用这篇Java防盗链攻略说再见!
  • python中的import和from两种导入方式有什么区别
  • MyBatis核心技术全解
  • 标注工具labelimg使用简介
  • 用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码
  • 【Java EE进阶 --- SpringBoot】Spring IoC
  • 机器学习基础-day03-机器学习中的线性回归
  • GPT-5冷酷操盘,游戏狼人杀一战封神!七大LLM狂飙演技,人类玩家看完沉默
  • FastGPT源码解析 Agent工作流编排后端详解
  • Python基础(①④内存管理机制)
  • 脑卒中目标检测含完整数据集
  • Unity核心概率⑤:GameObject
  • 【Python办公】tkinter词云图生成器
  • 使用Qt Charts实现高效多系列数据可视化
  • 【数据可视化-106】华为2025上半年财报分析:用Python和Pyecharts打造炫酷可视化大屏