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

ops/2024/12/26 4:10:41/

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.ppmy.cn/ops/145026.html

相关文章

【Redis】缓存

什么是缓存 https://tech.meituan.com/2017/03/17/cache-about.html Spring Data Redis Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能。 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…

亚洲媒体发稿如何抓住关键词提升排名-华媒舍

在如今数字经济时代&#xff0c;亚洲地区新闻发稿推广已成为企业宣传策划的重要途径。在众媒介平台中提高宣传稿件的排名并非易事。其中一个主要因素是怎样把握住关键词&#xff0c;以提高文章中的百度搜索引擎排名。下面我们就为大家介绍亚洲地区新闻发稿推广中怎么灵活运用关…

List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能

一、前言 在开发过程中&#xff0c;我们常常需要在集合中遍历元素进行一些操作。Java 中的集合框架提供了丰富的接口和工具&#xff0c;可以简化我们对集合的操作。然而&#xff0c;随着代码逻辑变得复杂&#xff0c;特别是在进行元素的删除或添加操作时&#xff0c;问题可能会…

微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用

目录 画板创建canvas绘制及渲染画笔粗细功能实现画笔颜色选择画笔痕迹撤回、板擦、画布清空canvas解析微信小程序中 canvas 的应用场景canvas 与 2D 上下文、webgl 上下文的关系图像的加载与绘制说明代码说明画板创建 canvas绘制及渲染 在wxml添加对应的canvas标签代码,并在j…

华为云计算HCIE笔记04

第五章&#xff1a;华为云Stack标准组网 目前华为云Stack的标准组网是分为了单核心、双核心以及三层组网架构三种模式。 单核心组网指的是Spine层面上只有一个核心&#xff08;两台交换机做stack堆叠&#xff0c;逻辑上就是1台设备&#xff09;&#xff0c;所有的流量转发都需要…

JMeter 二次开发之环境准备

通过JMeter二次开发&#xff0c;可以充分发挥JMeter的潜力&#xff0c;定制化和扩展工具的能力以满足具体需求。无论是开发自定义插件、函数二次开发还是定制UI&#xff0c;深入学习和掌握JMeter的二次开发技术&#xff0c;将为接口功能测试/接口性能测试工作带来更多的便利和效…

windows下glib库的编译与调试

glib库是一个纯C库&#xff0c;源于GIMP&#xff0c;它是GIMP、GTK/GTK以及GNOME等的基石库&#xff0c;在Linux下起作举足轻重的作用。对于学习C语言及数据结构&#xff0c;glib库也是一个非常不错的选择。在学习的过程中如果能够调试代码&#xff0c;将会对代码有更直观的理解…

linux检测硬盘

通过fdisk 查看显示所有磁盘或闪存的信息 fdisk -l /dev/sd*使用 badlocks检查 linux 硬盘上的坏道/坏块。也可以修复坏道&#xff0c;但仅限于逻辑坏道&#xff0c;物理坏道只能更换硬盘 badblocks -s -v /dev/vdb1 > /badblocks-vdb1.txt tail -f badblocks-vdb1.txt #检…