当前位置: 首页 > 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();}

相关文章:

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

原始代码 脚本逻辑先获取redis的值&#xff0c;判断是否等于期望值。 条件成立则删除&#xff0c;不成立则返回0 if redis.call(get, KEYS[1]) ARGV[1] thenreturn redis.call(del, KEYS[1]) end return 0 测试代码 根据上面的逻辑加了测试&#xff0c; 在判断成功后等待5…...

win10系统nodejs的安装npm教程

1.在官网下载nodejs&#xff0c;https://nodejs.org/en 2&#xff0c;双击nodejs的安装包 3&#xff0c;点击 next 4&#xff0c;勾选I accpet the terms in…… 5&#xff0c;第4步点击next进入配置安装路径界面 6,点击next&#xff0c;选中Add to PATH &#xff0c;旁边…...

C语言assert函数:什么是“assert”函数

我一直在学习 OpenCV 教程&#xff0c;遇到了assert函数;它做什么&#xff1f; assert将终止程序&#xff08;通常带有引用 assert 语句的消息&#xff09;&#xff0c;如果其参数为 false。它通常在调试过程中使用&#xff0c;以使程序在发生意外情况时更明显地失败。 例如&…...

R语言绘图-5-条形图(修改坐标轴以及图例等)

0. 说明&#xff1a; 1. 绘制条形图&#xff1b; 2. 添加文本并调整位置&#xff1b; 3. 调整x轴刻度的字体、角度及颜色&#xff1b; 4. 在导出pdf时&#xff0c;如果没有字体&#xff0c;该怎么解决问题&#xff1b; 1. 结果&#xff1a; 2. 代码&#xff1a; library(ggp…...

uniapp自定义权限菜单,动态tabbar

已封装为组件&#xff0c;亲测4个菜单项目可以切换&#xff0c; 以下为示例&#xff0c;根据Storage 中 userType 的 值&#xff0c;判断权限菜单 <template><view class"tab-bar pb10"><view class"tabli" v-for"(tab, index) in ta…...

ubuntu20.04配置解压版mysql5.7

目录 1.创建mysql 用户组和用户2.下载 MySQL 5.7 解压版3.解压 MySQL 文件4.将 MySQL 移动到适当的目录5.更改mysql目录所属的用户组和用户&#xff0c;以及权限6.进入mysql/bin/目录&#xff0c;安装初始化7.编辑/etc/mysql/my.cnf配置文件8.启动 MySQL 服务&#xff1a;9.建立…...

【js】vue获取document.getElementById(a)为null

需求 在菜单A页面点击某个元素携带id跳转到B详情页面&#xff0c;B页面获取该id元素的offsetTop, 并自动滚动到该元素处 问题 跳转到B详情页面, 在mounted获取到document.getElementById(a)为null, 因为整个详情页面是从后端获取来渲染的数据, 因此此时dom元素还未渲染出来,…...

系列六、Mybatis的一级缓存

一、概述 Mybatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xff09;&#xff0c; 第二次执行相同的查询时&#xff0c;会…...

用中文编程工具给澳大利亚客户定制开发的英文版服装进销存软件应用实例

用中文编程工具给澳大利亚客户定制开发的英文版服装进销存软件应用实例 软件从2016年一直用到现在&#xff0c;而且开的分店也是安装的这个软件&#xff0c;上图是定制打印的格式。 该编程工具不但可以连接硬件&#xff0c;而且可以开发大型的软件。 编程系统化课程总目录及明…...

geoserver 的跨域问题怎么解决

文章目录 问题分析问题 geoserver 发生跨域问题报错 分析 要解决 GeoServer 的跨域问题,可以通过配置 GeoServer 的 web.xml 文件来启用跨域资源共享(CORS)。以下是一些简单的步骤来实现这一点: 找到 GeoServer 的安装目录下的 webapps/geoserver/WEB-INF 文件夹。在该文…...

SQL语法实践(一)

文章 原文链接 实践 CREATE TABLE friend(fid INT NOT NULL,NAME VARCHAR(10) NOT NULL,age INT NOT NULL,adress VARCHAR(10) )SHOW TABLES; SELECT * FROM friend; SELECT fid,NAME FROM friend;INSERT INTO friend VALUES(1,Jack,18,Tianjing); INSERT INTO friend VALUE…...

路由器如何设置IP地址

IP地址是计算机网络中的关键元素&#xff0c;用于标识和定位设备和主机。在家庭或办公室网络中&#xff0c;路由器起到了连接内部设备和外部互联网的关键作用。为了使网络正常运行&#xff0c;需要正确设置路由器的IP地址。本文将介绍如何设置路由器的IP地址&#xff0c;以确保…...

自动驾驶算法(一):Dijkstra算法讲解与代码实现

目录 0 本节关键词&#xff1a;栅格地图、算法、路径规划 1 Dijkstra算法详解 2 Dijkstra代码详解 0 本节关键词&#xff1a;栅格地图、算法、路径规划 1 Dijkstra算法详解 用于图中寻找最短路径。节点是地点&#xff0c;边是权重。 从起点开始逐步扩展&#xff0c;每一步为一…...

MS5910PA为行业内领先的可配置10bit到16bit分辨率的旋变数字转换器,可替代AD2S1210

MS5910PA 是一款可配置 10bit 到 16bit 分辨率的旋 变数字转换器。片上集成正弦波激励电路&#xff0c;正弦和余弦 允许输入峰峰值幅度为 2.3V 到 4.0V &#xff0c;频率范围为 2kHz 至 20kHz 。 转换器可并行或串行输出角度和速度对应的 数字量。 MS5910PA 采…...

Random指定随机种子遇到的坑

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言指定随机种子出现的问题&#xff1f;总结 前言 业务中&#xff0c;之前有一个抽奖的需求&#xff0c;之初想让固定的奖品和玩家绑定一个固定的池子&#xff0c…...

2023云栖大会:属于开发者的狂欢

就在10月31日这天&#xff0c;杭州云栖小镇热闹非凡&#xff0c;第八届云栖大会在杭州云栖小镇盛大举行。这次大会以“聚焦大模型与生成式AI”为主题&#xff0c;开发者们齐聚一堂&#xff0c;共同探讨前沿技术趋势&#xff0c;以及如何将这些技术应用到实际业务场景中。 当然…...

jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目

选题目的 本设计课题为网上订餐系统设计与实现&#xff0c;提供无纸化点餐、支付&#xff0c;实现点餐快捷&#xff0c;方便管理。餐厅电子化是目前的潮流和趋势&#xff0c;大多数企业都将公司内部运营流程电子化。网上订餐管理系统应运而生&#xff0c;能够有效提高公司的管…...

优化大表分页查询性能:大表LIMIT 1000000, 10该怎么优化?

在处理大数据量的MySQL表时&#xff0c;我们经常会遇到一个问题&#xff1a;当我们尝试使用LIMIT语句进行分页查询时&#xff0c;性能会随着偏移量的增加而显著下降。例如&#xff0c;SELECT * FROM table LIMIT 1000000, 10 这样的查询可能会非常慢。那么&#xff0c;我们应该…...

ubuntu PX4 vscode stlink debug设置

硬件 stlink holybro debug板 pixhawk4 安装openocd 官方文档&#xff0c;但是第一步安装建议从源码安装&#xff0c;bug少很多 github链接 编译安装&#xff0c;参考 ./bootstrap (when building from the git repository)./configure [options]makesudo make install安装后…...

Flask的一种启动方式和三种托管方式

1. 原生启动 Flask 支持使用原生的 app.run() 方法来启动应用程序。这种方法是最简单、最基本的启动方式&#xff0c;适用于开发环境和小型应用程序。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__…...

华为设备上MQC实战:用流策略搞定网络流量路径规划(含ACL+OSPF联动)

华为设备MQC高级应用&#xff1a;动态路由环境下的智能流量路径规划 在复杂的企业网络环境中&#xff0c;流量路径规划往往成为网络工程师面临的核心挑战之一。当网络中存在多条等价路径时&#xff0c;传统的路由协议&#xff08;如OSPF&#xff09;会基于简单的哈希算法进行负…...

终极指南:ChatGPT-Web-Midjourney-Proxy如何实现实时AI交互的WebSocket通信

终极指南&#xff1a;ChatGPT-Web-Midjourney-Proxy如何实现实时AI交互的WebSocket通信 ChatGPT-Web-Midjourney-Proxy是一套集成ChatGPT、Midjourney和GPTs功能的全栈UI解决方案&#xff0c;通过WebSocket技术实现了流畅的实时AI交互体验。本文将深入解析其WebSocket通信机制…...

港澳通行证照片怎么手机拍?2026 手机拍摄规格要求和实用方法全解

准备办理港澳通行证却被照片规格搞得不知所措&#xff1f;其实用手机就能拍出符合要求的证件照&#xff0c;关键是掌握正确的拍摄方法和规格标准。这篇文章将详细讲解港澳通行证照片的手机拍摄方法&#xff0c;包括规格要求、拍摄步骤&#xff0c;以及如何后期处理让照片完美达…...

基于智能体的企业级自主决策与业务运营平台解决方案:AI智能管理驾驶舱、智能管理驾驶舱的四大功能定位、总体方案蓝图、总体规划方案

该方案提出以AI大模型与智能体为核心的“智能管理驾驶舱”&#xff0c;通过整合企业私有数据及业务系统&#xff0c;实现从信息呈现、自主决策到自动执行的业务闭环。平台支持事件驱动、可视化编排与多智能体调度&#xff0c;覆盖生产、供应链等典型场景&#xff0c;旨在降低运…...

高通平台Sensor驱动移植避坑指南:以QCM6490平台BMI160为例,从编译到上电调试全流程

高通平台Sensor驱动移植实战&#xff1a;QCM6490平台BMI160全流程避坑指南 1. 环境准备与基础架构解析 在QCM6490平台上进行BMI160传感器驱动移植前&#xff0c;必须充分理解高通SEE架构的设计理念。与传统的SSC架构相比&#xff0c;SEE架构通过模块化封装大幅降低了移植复杂度…...

从零到一:AI 3D建模革命,5分钟让图片“活“起来的完整实战指南

从零到一&#xff1a;AI 3D建模革命&#xff0c;5分钟让图片"活"起来的完整实战指南 【免费下载链接】TripoSR TripoSR: Fast 3D Object Reconstruction from a Single Image 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR 你是否曾梦想过&#…...

GGCNN实战指南:基于深度学习的实时机器人抓取生成网络深度解析

GGCNN实战指南&#xff1a;基于深度学习的实时机器人抓取生成网络深度解析 【免费下载链接】ggcnn Generative Grasping CNN from "Closing the Loop for Robotic Grasping: A Real-time, Generative Grasp Synthesis Approach" (RSS 2018) 项目地址: https://gitc…...

基于RK3568的智能家居控制器:硬件选型、架构设计与软件实现全解析

1. 项目概述&#xff1a;为什么选择RK3568作为智能家居控制器的“大脑”&#xff1f;在智能家居这个赛道里摸爬滚打了十来年&#xff0c;我经手过不少方案&#xff0c;从早期的单片机到后来的ARM Cortex-A系列&#xff0c;再到如今百花齐放的各类SoC。每次做产品选型&#xff0…...

Python点云数据处理避坑指南:pypcd与pypcd4库在Ubuntu下的安装与实战对比

Python点云数据处理避坑指南&#xff1a;pypcd与pypcd4库在Ubuntu下的安装与实战对比 在3D视觉、自动驾驶和机器人开发领域&#xff0c;点云数据处理是基础而关键的环节。Ubuntu作为主流的开发环境&#xff0c;配合Python生态中的pypcd和pypcd4库&#xff0c;为工程师提供了高…...

Vibe Coding 灾难的爆发

AI 编程工具确实正在颠覆软件行业&#xff0c;但几乎比我所见过的任何事物都更属于那个"如果没有丰富的前期经验&#xff0c;你不应该在家尝试"的类别&#xff1a; Reddit 上 vibe coding 灾难故事堆积如山。除非你介入并为 AI 建立结构&#xff0c;否则它就会推送垃…...