springboot项目使用lua脚本的流程概览
在 Spring Boot 3.x 项目中,利用已有的 Redis 依赖(通常是 spring-boot-starter-data-redis)来使用 Lua 脚本非常简单。使用 Lua 脚本最大的好处是可以保证多个 Redis 操作的原子性,并且能够显著减少网络开销。
下面为你整理了一套标准的实战步骤,教你如何在项目中优雅地集成和调用 Lua 脚本:
第一步:编写 Lua 脚本文件
首先,在你的 Spring Boot 项目的资源目录下创建一个 Lua 脚本文件。
建议路径:src/main/resources/lua/your_script.lua
假设我们写一个简单的“获取值,若不存在则设置默认值”的脚本:
▼lua复制代码-- get_or_set_default.lua local key = KEYS[1] local defaultVal = ARGV[1] local value = redis.call('GET', key) if not value then redis.call('SET', key, defaultVal) value = defaultVal end return value
- KEYS:用于接收你传入的 Redis 键(数组形式)。
- ARGV:用于接收你传入的其他业务参数(数组形式)。
- redis.call():在 Lua 脚本中执行 Redis 命令的标准方式。
第二步:将 Lua 脚本配置为 Bean
在 Spring Boot 3.x 中,推荐将 Lua 脚本封装成一个 RedisScript 的 Bean,交由 Spring 容器管理。这样不仅加载一次即可复用,Spring Data Redis 还会自动帮你处理脚本的 SHA1 缓存(即底层自动使用 EVALSHA 命令,极大提升性能)。
创建一个配置类:
▼java复制代码import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.scripting.support.ResourceScriptSource; @Configuration public class RedisLuaConfig { @Bean public RedisScript<String> getOrDefaultScript() { DefaultRedisScript<String> redisScript = new DefaultRedisScript<>(); // 加载类路径下的 lua 脚本 redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/get_or_set_default.lua"))); // 指定脚本返回值的类型(支持 String, Long, Boolean, List 等) redisScript.setResultType(String.class); return redisScript; } }
第三步:在业务代码中调用脚本
在你的 Service 或 Component 中,直接注入 RedisTemplate 和刚刚配置好的 RedisScript Bean,然后通过 execute 方法执行即可。
▼java复制代码import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; @Service public class RedisLuaService { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private RedisScript<String> getOrDefaultScript; public String getValueOrDefault(String key, String defaultValue) { // 调用 execute 方法执行 Lua 脚本 // 参数依次为:脚本对象、键的列表、其余参数(可变长参数) return redisTemplate.execute( getOrDefaultScript, Collections.singletonList(key), defaultValue ); } }
💡 核心注意事项
- 序列化问题:
RedisTemplate默认的 Key 和 Value 序列化方式可能会影响 Lua 脚本的参数传递。如果你的 Key 是普通的字符串,建议确保RedisTemplate的 Key 序列化器使用的是StringRedisSerializer,否则传入脚本的 Key 可能会带有额外的序列化前缀(如\xac\xed\x00\x05t\x00...)。 - 参数传递规则:
在
redisTemplate.execute()方法中,KEYS必须通过List传入,而ARGV则是跟在后面的可变长参数。在 Lua 脚本中分别通过KEYS[1],ARGV[1]等下标来获取。 - 返回值类型:
在配置
DefaultRedisScript时,务必通过setResultType明确指定返回值的 Java 类型,否则可能会导致类型转换异常。
按照以上三步,你就可以在 Spring Boot 3.x 项目中轻松、高性能地使用 Redis Lua 脚本来处理复杂的原子性业务逻辑了。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
昨天,我阅读了tare公众号的如何用tare work制作PPT的文章,今天就准备做一下(上个月薅到的pro还没用完),我先是把这篇文章丢给元宝(主要是免费还便捷),让它总结分析,因为原文是符合商业路演节奏的PPT,而我要做的是项目答辩的PPT,所以我还让元宝将风格改了一下,使其写作链路符合我的节奏,然后我将与元宝的聊天全部导出给work学习,叫它先生成html文件格式的PPT,先看看效果怎样,然后让它生成真正的PPTX文件,我还同步将html文件给qoder了,叫它也生成了一版,第一次生成没说明背景,所以自动生成了深色背景,第二次,叫它生成浅色的,就生成了,来看看效果
最后三张是效果,这些PPT都是基于work生成的HTML原型来设计的,并没有用的复杂的提示词工程,只有单纯的一句话(前四张图证明)
很明显,work生成的(第五张)存在文字遮挡,文字看不清,封面无设计体现,每一页右下角居然还标识是AI生成的,这些痛点在qoder中都很好的解决了,截图中的效果都是它们一次性生成,我没有做任何改动,所以qoder还是最顶级的PPT生成工具,对于一个只是应付答辩的学生来说是这样😆
已经让work生成skill了,效果还未体验,后续还需要完善的
4
qoder活动,领了credits,使用生成PPT的功能,发现效果比市面上大多数结合大模型生成PPT的功能都要优秀,注意,不要选择那个skill,直接选择默认的beta版本生成PPT中的一个模版就好,然后让另一个AI把你的内容做成md格式,你审阅好内容之后,让qoder根据已检阅的内容md文档生成,点击生成,之后会让你确定大纲,有个注意的地方,如果你有时间线要表达的话,要说一下时间线是水平波浪(类似第二张,波浪形式依模版而定),否则就是默认的水平线(类似第一张);最重要的是有升成可视化图表功能,你在描述的时候说一下能做成图表的都做成图表就行了;发现整体设计规整,不会出错,用形状做点缀,卡片式布局,可以看到有些卡片有很多留空(类似第一张图后面bug热点那块,我让他生成了对应符合小标题描述的图放上去了,不至于太空)所以它还可以根据描述生成有意义的图片,但效果始终还是图形而不是图像(看第二张第一页右上角那个图),这就是今天用qoder的实操效果,明天答辩😂
7
我无证据的猜测一下哈,在AI潮流中,比间某某商城,某某外卖的大众项目,将会是某某flow(类似coze,dify),某某cli(类似cc,cx,oc,gc),某某coder(桌面版形式类似tare, codebuddy),继而肯定会衍生出某某模型接入网关(类似百炼,硅基流动),鱼皮哥已经出了零代码了,这些将来必定都会成为AI潮流中的大众项目,形成NPC简历😂,但是的但是,今年你要是写这些肯定能够在众人皆唱衰互联网行业中成为香饽饽,幸运的是,我无法预测这会从哪一年开始,所以啊,在此到来之前,继续学习吧,不要悲伤,不要心急。我先背作文了,晚上还要完成期末作业呢,我就希望不要是明年到来就好😅
3
噢耶,作业有救了,花一分钱购置了小米tokenplan,现在有100多亿token啦,真是太疯狂了😂,不过为啥有人有800多亿😢
4
刚弄好codex,但我还不敢用,我没充钱怕他封我,想问哥哥们,没充钱的用的话有哪些需要注意的😅
2
