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

springboot整合redis+lua实现getdel操作保证原子性

  1. 原始代码

脚本逻辑先获取redis的值,判断是否等于期望值。 条件成立则删除,不成立则返回0

if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1])
end
return 0
  1. 测试代码

根据上面的逻辑加了测试, 在判断成功后等待5秒后执行删除操作。同时开启另外一个线程去修改这个key的值, 发现修改的线程一直阻塞。直到等待的线程5秒结束后且完成删除操作后,修改的线程才会执行。

原因:

redis是单线程执行,

Redis会将整个Lua脚本作为一个原子操作执行,这意味着脚本中的多个命令要么全部执行成功,要么全部失败。这有助于维护数据的原子性和一致性。

Redis执行Lua脚本时,它会自动锁定相关的键,以防止其他客户端对这些键进行并发修改。这确保了在脚本执行期间对键的访问是互斥的。

注意: 如果脚本中涉及多个key的操作并redis部署的是cluster模式时, 需要额外确认多个key都在一个slot中。还好我这就1个key!!!略过.............

String str_script =// 1. 判断key的值是否等于期望值,等于则进行删除,不相等则直接结束"if (redis.call('get', KEYS[1]) == ARGV[1]) then\n" +"    local start = redis.call('TIME')[1] * 1000 + redis.call('TIME')[2] / 1000\n" +"    while (redis.call('TIME')[1] * 1000 + redis.call('TIME')[2] / 1000 - start) < 5000 do\n" +"        print('等待5秒结束.....')"+"    end\n"+// 2. 值判断成功,等待5秒执行删除操作"    return redis.call('del', KEYS[1])\n" +"end\n" +"return 0";public String getAndDelete(String key, String expectedValue) {log.info("start..................");DefaultRedisScript script = new DefaultRedisScript(str_script, Long.class);Object res = redisTemplate.execute(script, Collections.singletonList(key), expectedValue);log.info("end..................");return res.toString();}

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

相关文章:

  • win10系统nodejs的安装npm教程
  • C语言assert函数:什么是“assert”函数
  • R语言绘图-5-条形图(修改坐标轴以及图例等)
  • uniapp自定义权限菜单,动态tabbar
  • ubuntu20.04配置解压版mysql5.7
  • 【js】vue获取document.getElementById(a)为null
  • 系列六、Mybatis的一级缓存
  • 用中文编程工具给澳大利亚客户定制开发的英文版服装进销存软件应用实例
  • geoserver 的跨域问题怎么解决
  • SQL语法实践(一)
  • 路由器如何设置IP地址
  • 自动驾驶算法(一):Dijkstra算法讲解与代码实现
  • MS5910PA为行业内领先的可配置10bit到16bit分辨率的旋变数字转换器,可替代AD2S1210
  • Random指定随机种子遇到的坑
  • 2023云栖大会:属于开发者的狂欢
  • jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 优化大表分页查询性能:大表LIMIT 1000000, 10该怎么优化?
  • ubuntu PX4 vscode stlink debug设置
  • Flask的一种启动方式和三种托管方式
  • cudnn too short
  • 01、SpringBoot + MyBaits-Plus 集成微信支付 -->项目搭建
  • Linux 性能调优之网络优化
  • RT-Thread系统使用常见问题处理记录
  • 优先队列----数据结构
  • nginx项目部署教程
  • 资源限流 + 本地分布式多重锁——高并发性能挡板,隔绝无效流量请求
  • day52【子序列】300.最长递归子序列 674.最长连续递增序列 718.最长重复子数组
  • 计算机视觉 计算机视觉识别是什么?
  • Make.com实现多个APP应用的自动化的入门指南
  • LLMs之HFKR:HFKR(基于大语言模型实现异构知识融合的推荐算法)的简介、原理、性能、实现步骤、案例应用之详细攻略