Redis_配合Lua做Java分布式事务锁

java编写redis+lua脚本分布式锁 redis lua java 分布式锁 阅读详情

Redis作Java分布式锁

 我们都知道redis现在成为越来越多人作为缓存工具的选择,redis在性能、操作等方面上有着独特的优势。

1. 检查reids版本
  因为redis是在2.6版本后才内置了Lua脚本解释器,所以也就是说要用redis执行lua脚本,最基本的要求就是redis版本必须是2.6.0以上。
  查看redis版本命令:info
在启动redis客户端后,连接redis客户端,输入命令如下图:
查询redis版本号命令
 

2.编写lua脚本
  做分布式锁的lua语句如下,这边选的是最简单的语句:

local key = KEYS[1]
local value = KEYS[2]
local sec = KEYS[3]

local result = redis.call("SET",key, value, "NX", "EX", sec)
if(result) then
	return 1
else
	return 0;
end

 这个lua脚本的意思是传三个值,第一个值是键,第二个值是值,第三个值是过期时间,单位秒。

3.使用DOS窗口让redis客户端调用lua脚本
 使用DOS命令调用

命令为:redis-cli.exe --eval E:\redis\redisLock.lua testKey testValue 300(--前有个空格)

参数解释
redis-cli.exe调用该服务
–eval告诉redis客户端进行执行lua脚本
E:\redis\redisLock.lua这边是我自己的路径,换成你们lua脚本路径
testKey、testValue、300这个lua脚本接受的数据,根据你自己编写的lua脚本而定

结果
 我们可以看到我们设置的redis的结果和我们预期的是一样的。

4.Java整合Redis

 先上Java上的代码:

package com.dahantc.iot.util;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.ScriptSource;
import org.springframework.scripting.support.ResourceScriptSource;
import org.springframework.stereotype.Service;

import com.dahantc.iot.core.util.LogUtil;

@Service
public class LuaRedisLockUtils{
	
	private final static Logger logger = LogUtil.get();
	
	@Autowired
	private RedisTemplate redisTemplate;
	
	public Boolean lock(String key, String value, String seconds){
		try{
			String path = "redis_lock.lua";
			ClassPathResource resource = new ClassPathResource(path);
			ScriptSource scriptSource = new ResourceScriptSource(resource);
			DefaultRedisScript defaultRedisScript = new DefaultRedisScript();
			defaultRedisScript.setScriptSource(scriptSource);
			//设置返回类型
			defaultRedisScript.setResultType(Long.class);
			
			//组装数据
			List<Object> keyList = new ArrayList<>();
			keyList.add(key);
			keyList.add(value);
			keyList.add(seconds);
			// 第三个参数是无用的,但不能为空,考虑到内存空间,遂作故用
			Long result = (Long)redisTemplate.execute(defaultRedisScript, keyList);
			return result == 1;
		}catch(Exception e){
			logger.error("redis分布式锁存在异常,请注意key:{},value:{}, seconds:{}", key, value, seconds);
			return false;
		}
	}

}

lua脚本位置
 该项目过测试,整合是成功。这边不再跑一遍作示范了。

 总结:BASE理论面向的是大型高可用可扩展的分布式系统,和我们传统的ACID型事务是背道而驰的。传统ACID事务要求的是强一致性,而分布式系统则是通过牺牲强一致性来换取可用型,允许数据在某较短的时间内不一致,当然分布式系统也是要保证数据的最终一致性。

Java+Redis的库存处理(利用lua脚本) 我们的订单处理系统中,对库存的更改在这之前一直是使用的数据库update,但是近几年直播带货盛行,经常会出现短时间内同一个商品的销售量高达几十万甚至上百万,但因为高频率的更新同一条库存数据,受到数据库行锁限制,每秒钟的qps只能达到 500 ~ 1000 左右,虽然升级硬件可以提高qps,但基于成本考虑,我们选择了利用Redis,根据官方提供的数据,Redis单节点的QPS可以达到约100000+。模板抽象类:DdzStockTemplate。接口:DdzStockCallback。 阅读详情

相关推荐

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码)

本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。

weixin_29313239的博客 283

redis + lua分布式锁

package com.jd.car.parrot.web.plugin.ratelimter; import com.google.common.collect.Lists; import com.car.parrot.web.plugin.config.Singleton; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframe..

snail_bi的博客 900

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间

本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。

meat5的博客 492

Redis事务与Lua脚本:原子性操作的利器,用法与最佳实践

Redis事务与Lua脚本提供了Redis中实现原子性操作的两种方案。Redis事务通过MULTI/EXEC命令组合实现简单命令的打包执行,配合WATCH可构建乐观锁机制,但不支持复杂逻辑。Lua脚本则能实现更复杂的原子性操作,减少了网络往返开销。Java示例展示了两种方式的应用场景:基础事务操作、乐观锁转账、库存扣减等。Lua脚本模板提供了变量定义、条件判断、循环操作等基础语法,适用于需要复杂逻辑处理的场景。选择时应根据操作复杂度决定使用事务还是脚本。

m0_75126572的博客 1117

从翼型到湍流:用生活化案例图解空气动力学核心概念(中英双语版)

本文通过飞机机翼、F1赛车、高尔夫球等生活化案例,图解空气动力学核心概念。深入浅出地解释了攻角如何产生升力、边界层与流动分离如何影响阻力、马赫数如何划分速度世界,以及涡流与湍流的特性与应用。文章还介绍了计算流体动力学(CFD)这一现代数字风洞工具,帮助读者直观理解这些塑造现代交通与运动设计的无形之力。

metaverse5vr的博客 475

mtk-drm commit送显流程(二):内核态atomic_commit实现解析

本文深入解析了mtk-drm框架中atomic_commit机制的内核态实现流程,详细介绍了从用户态触发到硬件提交的完整调用链,包括状态检查、硬件提交等关键阶段。特别分析了MTK平台在动态刷新率、内存带宽优化等方面的特有实现策略,为开发者提供了调试技巧和常见问题解决方案。

weixin_30839881的博客 1305

Redis实现分布式读写锁(Java基于Lua实现)

Redis实现分布式读写锁 前言 使用Jedis构建redis连接池,使用lua脚本命令保证redis的事务,以实现分布式的读写锁。项目中需要用到分布式的读写锁,开始使用Redisson的读写锁实现,压测的时候时不时会抛异常获取锁超时,初步判断是Redisson中redis连接池设置的太小。由于项目中还自己另外维护着一个redis的连接池JedisPool,故决定自己来实现分布式的可重入读写锁。 ...

grandachn的博客 6957

掌握 Unity 中的状态机:综合指南

最后,将拥有一个由状态机驱动的功能齐全的播放器控制器,可以集成到自己的项目中。此外,状态机有助于实现复杂的人工智能、玩家控制、动画系统等,从而形成更强大、更灵活的游戏架构。状态机是计算机科学和游戏开发中的一个基本概念,它通过定义一组有限的状态及其之间的转换来模拟实体的行为。你可以定义常见的状态行为,例如 Enter、Update 和 Exit 方法,确保整个状态机架构的一致性和连贯性。由于前面提到的状态类扩展了 BaseState 类,因此我们可以为具有不同状态的不同对象创建单独的类。

yolo模型训练找我,AI游戏合作找我 1453

Redis分布式事务锁的原理(上)

我们在单机服务器,出现资源的竞争,一般使用synchronized 就可以解决,但是在分布式的服务器上,synchronized 就无法解决这个问题,这就需要一个分布式事务锁。 除此之外面试,基本会问springboot、Redis,然后都会一路再聊到分布式事务、分布式事务锁的实现。 1、常见的分布式事务锁 1、数据库级别的锁 乐观锁,基于加入版本号实现 悲观锁,基于数据库的 for update 实现 2、Redis ,基于 SETNX、EXPIRE 实现 3、Zookeeper,基于InterP.

HaC 的博客 3173

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341)

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341) Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成,在GPL2.0及更新协议下发布。Drupal在某些情况下,通过文件模块或者子系统上传恶意文件触发XSS漏洞。

qq_51577576的博客 2208

Python 爬虫实战:爬取今日头条文章与阅读量数据

本文详细介绍了基于Python爬取今日头条文章与阅读量数据的完整方案。通过分析今日头条API接口,采用Requests+正则表达式技术实现数据抓取,重点解决加密参数构造、请求头模拟、反爬规避等核心问题。文章包含文章列表获取、详情数据提取、互动数据采集等完整流程,并提供数据存储与基础分析方法。同时强调合规使用爬虫技术,控制爬取频率,避免干扰平台运营。该方案可为内容传播分析、用户兴趣研究提供数据支持,但需注意接口参数更新和反爬机制变化,适时调整代码实现。

2503_91057718的博客 2519

redis watchdog_Redis与Redisson 分布式事务锁的原理

我们在单机服务器,出现资源的竞争,一般使用synchronized 就可以解决,但是在分布式的服务器上,synchronized 就无法解决这个问题,这就需要一个分布式事务锁。除此之外面试,基本会问springboot、Redis,然后都会一路再聊到分布式事务、分布式事务锁的实现。1、常见的分布式事务锁1、数据库级别的锁乐观锁,基于加入版本号实现悲观锁,基于数据库的 for update...

weixin_39568706的博客 503

可编程逻辑控制器(PLC)系列:Mitsubishi MELSEC-Q_(8).MELSEC-Q系列PLC故障诊断与维护

MELSEC-Q系列PLC的故障诊断与维护是一个系统性的过程,需要工程师具备扎实的理论基础和丰富的实践经验。通过了解故障类型、使用诊断工具、遵循诊断步骤,可以有效地定位和解决故障问题。同时,定期的检查与保养、备份与恢复、优化程序和配置,以及提供良好的运行环境,可以减少故障的发生,提高系统的可靠性。希望本文能够帮助工程师在故障诊断与维护过程中更加得心应手,确保MELSEC-Q系列PLC的稳定运行。

2401_87715305的博客 1247

阿里巴巴 P6 Java 面试全流程实录:高并发实战与 Redis Lua 深度解析

本文通过模拟阿里巴巴P6 Java面试,深入探讨高并发系统设计与Redis应用。候选人分享了3年Java开发经验,重点介绍了高并发抽奖系统项目,采用Redis+TIDB架构实现5万QPS的秒级响应。文章详细解析了Redis Lua脚本的原子性实现、异常处理机制,以及与Redis事务的区别对比。面试评分显示候选人在技术理解(10/10)、架构能力(9/10)和项目经验(10/10)方面表现突出。最后提供了完整的面试报告和AI模拟面试体验链接,帮助开发者提升面试技巧。

huazaijake的博客 506

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

黑马点评项目 | Redis学习笔记「纯享版」10w字超详细总结(含资料)

这次笔记是本人二刷Redis实战篇黑马点评的8w字汇总笔记。如果需要资料,于本文末尾查找即可

2025优快云博客之星Top246,后端开发技术领域新星创作者。 3万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

PayPal二面狂怼JVM、MySQL、Redis与分布式事务,Java后端面试八股文全复盘

在Java后端面试中,扎实掌握并发编程、JVM内存模型、MySQL索引与事务隔离级别、Redis缓存与分布式锁、幂等设计和分布式事务等底层原理,是应对大厂连环追问的关键。面试官往往不满足于概念背诵,而是围绕异常场景层层深挖,考察候选人是否真正理解机制运转与工程取舍。从TCP握手异常分支到InnoDB的MVCC可见性判断,从HashMap扩容细节到线程池任务分配顺序,再到支付场景下的最终一致性与幂等方案设计,这些高频技术点的灵活运用,直接决定了在大厂面试中的表现。本文以真实二面过程为线索,拆解八股文问题背后的

weixin_30387423的博客 312

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

我的redis学习感悟

(4)TCC 分布式事务:预扣库存,消息发送成功确认扣减,失败则调用 Lua 脚本回退库存,强一致性。还有一个问题,如果我们的数据存在多个服务器上面,若校验逻辑写在 Java 代码里,每台服务器代码一旦改漏、写错,就会出现漏洞,所以Lua 脚本固定存在 Redis,所有服务共用同一套校验扣减逻辑,规则统一,不会出现各机器判断标准不一样的问题。问题根源:Redis Lua 操作和 Kafka 消息发送分属两个中间件,无法原子执行,Lua 执行成功后消息发送失败会导致库存预扣但无订单,数据不一致。

qq_40458575的博客 396

Spring Cloud微服务电商秒杀系统面试实战(含缓存、消息队列与分布式事务)

面试官:严肃相对、专业引导候选人:谢飞机,简单问题能答出,复杂问题含糊其辞。

m0_67551826的博客 605

小明的Java面试奇遇之到店营销平台实战:Spring Cloud+Redis+Kafka硬刚洪峰

本文模拟了程序员小明应聘互联网大厂「到店营销平台Java工程师」岗位的5轮技术面试。围绕「百万人同时抢购优惠券」业务场景展开,深度覆盖Spring Cloud微服务治理、Redis分布式锁、Kafka消息队列、JVM性能优化等核心技术栈,通过60个渐进式问题展现架构设计全貌。特别适合准备中高级Java岗位的开发者,学习如何将技术方案与业务价值深度绑定。本文通过这些问题,完整呈现了Java工程师面试的核心考察点。

爱海贼的无处不在的技术博客 1958

Java全栈工程师面试实录:从电商场景到AI大模型的深度技术拷问

主要是高并发控制,会用Redis做分布式锁,数据库用分库分表,然后消息队列处理异步事务... Spring Boot肯定要用,JPA持久化,HikariCP连接池优化...:这个...我会用Kafka收集UGC数据,然后Spring Cloud Stream连接Kafka,消息处理器里接入AI API...(突然想到)但不知道怎么处理并发请求...:Spring AI可以接入OpenAI API啊...但不知道怎么整合检索增强生成(RAG)...(面试官:需要说明向量数据库如何选型?:好,你回答得很实在。

m0_75125940的博客 317

Java面试核心知识点总结:Redis与MySQL高可用、高并发解决方案

《Java高并发与分布式系统设计实战》摘要:本文系统探讨Redis与MySQL在分布式系统中的关键技术应用。Redis部分详解主从+哨兵部署、脑裂防护及分片集群优化,可使QPS提升5-8倍;MySQL部分涵盖慢查询优化、存储引擎选型及分库分表策略,实测查询性能提升10倍以上。同时提出混合架构设计方案,包括读写分离、缓存防护及分布式事务解决方案,并构建完整的性能监控工具链。最后展望Redis模块化、MySQL集群等未来技术趋势,强调分布式系统需要在CAP理论中寻找平衡点。

招风的黑耳优快云 762

Java大厂面试:从Spring Boot到微服务架构,这些场景你能Hold住吗?

好的,小张,你的基础知识还可以,但在高并发和分布式上需要加强学习。我们会再与HR讨论后给你答复。

Elevenmao的博客 432

Redis实现分布式锁详解

什么是分布式锁? 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lo

Code_Gods的博客 349

Java大厂面试现场:谢飞机硬刚并发编程与微服务架构

面试官李老师:谢飞机是吧?我看你写了熟悉Java并发编程,那我问你, 和 有什么区别?谢飞机:嗯……这个我知道! 是关键字,JVM 层面实现的,自动加锁解锁; 是 API,要手动 lock() 和 unlock(),还支持公平锁、可中断、超时获取锁!面试官李老师(微微点头):不错,那你知道 在 JDK 1.6 之后做了哪些优化吗?谢飞机:哦……这个……应该是有偏向锁、轻量级锁、重量级锁那个……升级机制?好像是为了减少线程阻塞带来的性能开销。面试官李老师:很好。那如果我现在有一个高并发的秒杀场景,库存扣减

m0_62758843的博客 983

能源与环保大厂Java面试实录:JDK17、Redis分布式锁、Kafka数据削峰、Seata分布式事务、Spring AI+RAG智能巡检,谢飞机三轮被虐哭(附完整答案解析)

老K的「等通知」不是终点,把Metaspace和Metaverse分清、把setnx换成Redisson、把for循环换成Netty、把背课文变成真理解,你也能从小白进化成「等通知侠」→「Offer收割机」。

You_Z_Lan的博客 205

Java面试核心:Spring Boot、微服务与Redis实战解析

在当今的Java技术栈中,Spring Boot、微服务架构和Redis已成为开发者必须掌握的核心技术。Spring Boot通过自动配置机制简化了传统Spring应用的开发流程,其底层原理涉及条件注解和starter机制,大幅提升了开发效率。微服务架构解决了单体应用的可扩展性问题,通过服务注册发现、配置中心和服务网关实现分布式系统治理,其中分布式事务和熔断限流是保障系统稳定性的关键技术。Redis作为高性能内存数据库,其底层数据结构和分布式锁实现原理是面试高频考点,合理运用多级缓存架构能显著提升系统性能。

weixin_33912638的博客 411
上一篇: MySQL优化__基础优化注意选项
下一篇: Eclipse_设置编辑器背景护眼色
pseudonym_
博客等级 码龄10年 88粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值