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

Redis分布式锁释放锁是否必须用lua脚本?

无lua脚本释放锁:

public void unlock(String key, String uniqueValue) {String value =redisDao.getString(key);if (value != null && value.equals(uniqueValue))redisDao.delete(key);
}

使用lua脚本释放锁:

	// LUA脚本 -> 分布式锁解锁原子操作脚本private static final String LUA_SCRIPT ="if redis.call('get',KEYS[1]) == ARGV[1] then" +" return redis.call('del',KEYS[1]) " +"else" +" return 0 " +"end";// lockId 一个不重复id -> 区分不同客户端public boolean unlock(String lockId) {Jedis client = jedisPool.getResource();try {Object result = client.eval(LUA_SCRIPT, Arrays.asList(LOCK_KEY), Arrays.asList(lockId));if (result != null && "1".equalsIgnoreCase(result.toString())) {return ture;}return false;} catch (Exception e) {e.printStackTrace();log.error(e.getMessage());}return false;}

在释放锁的时候,如果没用原子操作,那么取值、比较、删除是三步操作。
假设现在是线程A在执行当前的动作。如果线程A取值之后,删除操作之前,key正好过期了,那么锁就自动释放了。这时,又被另外一个线程B获取了锁,那么在删除操作时,就会把线程B的锁给删除掉。如果这时线程B还在执行中,因为线程B的锁被线程A给删除掉了,那么其他的线程C也就可以获取到锁了。这样,其实临界区就有多个线程在运行了。

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

相关文章:

  • JVM系列(十三) -常用调优工具介绍
  • 数据中心虚拟化与高可用性架构实施指南
  • 对文件内的文件名生成目录,方便查阅
  • leetcode hot100 轮转数组
  • 定位方式:css
  • 谷歌浏览器的网络连接问题解决方案
  • 保护模式基本概念
  • Linux程序设计(第四版)| 学习笔记
  • 【Python-中级】Python中的线程池:ThreadPoolExecutor
  • 医疗信息系统有哪些
  • JVM系列(十二) -常用调优命令汇总
  • 修改采购订单BAPI学习研究-BAPI_PO_CHANGE
  • 使用uniapp开发微信小程序-框架搭建
  • 雅思真题短语(九)
  • 系统压力测试助手——stress-ng
  • java如何使用poi-tl在word模板里渲染多张图片
  • UE5 UHT GENERATED_BODY() GENERATED_USTRUCT_BODY()
  • 内网穿透ubuntu20 docker coplar
  • windows C++ TCP客户端
  • Linux xargs 命令使用教程
  • 什么是异步处理
  • 【解决问题】Java2DRenderer生成图片时中文乱码 Linux安装字体
  • WPF 依赖属性和附加属性
  • leetcode hot100 删除链表的第n个节点
  • MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
  • 记一MySQL连接速度慢的问题
  • asp.net core webapi项目中 在生产环境中 进不去swagger
  • 逆向攻防世界CTF系列63-secret-string-400
  • Datawhale AI 冬令营学习笔记-零编程基础制作井字棋小游戏
  • 分布式专题(10)之ShardingSphere分库分表实战指南