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

利用Java代码调用Lua脚本改造分布式锁

4.8 利用Java代码调用Lua脚本改造分布式锁

lua脚本本身并不需要大家花费太多时间去研究,只需要知道如何调用,大致是什么意思即可,所以在笔记中并不会详细的去解释这些lua表达式的含义。

我们的RedisTemplate中,可以利用execute方法去执行lua脚本,参数对应关系就如下图股

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Java代码

private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;static {UNLOCK_SCRIPT = new DefaultRedisScript<>();UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));UNLOCK_SCRIPT.setResultType(Long.class);}public void unlock() {// 调用lua脚本stringRedisTemplate.execute(UNLOCK_SCRIPT,Collections.singletonList(KEY_PREFIX + name),ID_PREFIX + Thread.currentThread().getId());
}
经过以上代码改造后,我们就能够实现 拿锁比锁删锁的原子性动作了~

小总结:

基于Redis的分布式锁实现思路:

  • 利用set nx ex获取锁,并设置过期时间,保存线程标示
  • 释放锁时先判断线程标示是否与自己一致,一致则删除锁
    • 特性:
      • 利用set nx满足互斥性
      • 利用set ex保证故障时锁依然能释放,避免死锁,提高安全性
      • 利用Redis集群保证高可用和高并发特性

笔者总结:我们一路走来,利用添加过期时间,防止死锁问题的发生,但是有了过期时间之后,可能出现误删别人锁的问题,这个问题我们开始是利用删之前 通过拿锁,比锁,删锁这个逻辑来解决的,也就是删之前判断一下当前这把锁是否是属于自己的,但是现在还有原子性问题,也就是我们没法保证拿锁比锁删锁是一个原子性的动作,最后通过lua表达式来解决这个问题

但是目前还剩下一个问题锁不住,什么是锁不住呢,你想一想,如果当过期时间到了之后,我们可以给他续期一下,比如续个30s,就好像是网吧上网, 网费到了之后,然后说,来,网管,再给我来10块的,是不是后边的问题都不会发生了,那么续期问题怎么解决呢,可以依赖于我们接下来要学习redission啦

测试逻辑:

第一个线程进来,得到了锁,手动删除锁,模拟锁超时了,其他线程会执行lua来抢锁,当第一天线程利用lua删除锁时,lua能保证他不能删除他的锁,第二个线程删除锁时,利用lua同样可以保证不会删除别人的锁,同时还能保证原子性。

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

相关文章:

  • 7/8电源连接器航空插头端子
  • 华为OD-C卷-游戏分组[100分]
  • 【c++】优先级队列|反向迭代器(vector|list)
  • gocron定时任务管理
  • JCYZ H3CNE-RS+
  • 太阳光光照试验耐久性老化试验使用太阳光模拟器系统
  • Centos 7.9.2009 下 Gitlab 完全卸载
  • Navicat Premium 16 for Mac/Win:数据库管理的全能之选
  • 使用腾讯云服务器如何搭建网站?新手建站教程
  • 抖音快手直播整蛊软件插件工具合集(多啦咪/梦歌)
  • 探究C++20协程(2)——取值、传值、销毁与序列生成器实现
  • 【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】
  • 机器人瓶胚检测工作站(H3U脉冲轴控制)
  • 数字货币:未来金融的崭新篇章
  • USACO18DEC部分题 补题报告
  • 聊一聊一些关于npm、pnpm、yarn的事
  • c语言多功能计算软件170
  • python图形化展示数据:保存为图片后查看
  • PostgreSQL入门到实战-第二十四弹
  • Spring Boot 统一功能处理(二)
  • Flutter开发基础之动画专题
  • PHP 图片裁剪类封装
  • Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示
  • FPGA:图像数字细节增强算法(工程+仿真+实物,可用毕设)
  • Android netty的使用
  • 苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区
  • 【Java SE】多态
  • Yarn vs npm的大同小异Yarn是什么?
  • 1.Godot引擎|场景|节点|GDS|介绍
  • springboot3 redis 实现分布式锁