【Spring连载】使用Spring Data访问Redis(十)----Lua脚本支持Scripting

【Spring连载】使用Spring Data访问Redis(十)----Lua脚本支持Scripting

Redis 2.6及更高版本支持通过eval 和 evalsha 命令运行Lua脚本。Spring Data Redis为运行处理序列化的脚本提供了高级抽象,并自动使用Redis脚本缓存。
脚本可以通过调用RedisTemplate和ReactiveRedisTemplate的execute方法来运行。两者都使用可配置的ScriptExecutor(或ReactiveScriptExecutor)来运行所提供的脚本。默认情况下,ScriptExecutor(或ReactiveScriptExecutor)负责序列化提供的键和参数,并反序列化脚本结果。这是通过template的键和值序列化程序完成的。还有一个额外的重载,允许你为脚本参数和结果传递自定义序列化程序。
默认的ScriptExecutor通过检索脚本的SHA1并尝试首先运行evalsha来优化性能,如果Redis脚本缓存中还没有脚本,则返回eval。
以下示例使用Lua脚本运行一个常见的"check-and-set"场景。这是Redis脚本的理想用例,因为它要求以原子方式(atomically)运行一组命令,并且一个命令的行为会受到另一个命令结果的影响。

java 复制代码
@Bean
public RedisScript<Boolean> script() {

  ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("META-INF/scripts/checkandset.lua"));
  return RedisScript.of(scriptSource, Boolean.class);
}
java 复制代码
public class Example {

  @Autowired
  RedisOperations<String, String> redisOperations;

  @Autowired
  RedisScript<Boolean> script;

  public boolean checkAndSet(String expectedValue, String newValue) {
    return redisOperations.execute(script, singletonList("key"), asList(expectedValue, newValue));
  }
}
lua 复制代码
-- checkandset.lua
local current = redis.call('GET', KEYS[1])
if current == ARGV[1]
  then redis.call('SET', KEYS[1], ARGV[2])
  return true
end
return false

前面的代码配置了一个RedisScript,指向一个名为checkandset.lua的文件,该文件应该返回一个布尔值。脚本resultType应为Long, Boolean, List或反序列化的值类型之一。如果脚本返回丢弃(throw-away)状态(特别是OK),它也可以为null。

最好在应用程序上下文中配置DefaultRedisScript的单个实例,以避免在每次运行脚本时重新计算脚本的SHA1。

然后,上面的checkAndSet方法运行脚本。脚本可以作为事务或管道的一部分在SessionCallback中运行。有关更多信息,请参阅"Redis事务"和"Redis管道 pipeline"。

Spring Data Redis提供的脚本支持还允许您使用Spring Task和Scheduler抽象来安排Redis脚本定期运行。有关更多详细信息,请参阅Spring Framework文档。

相关推荐
桃西西呀3 分钟前
Spring AI Alibaba 之七:我没写一行 tracing 埋点,Agent 每一步却被 Micrometer 看得清清楚楚
人工智能·spring·llm
桃西西呀3 分钟前
Spring AI Alibaba 之八:我让 Agent 直接执行 shell 命令,它却读到了目录里的密钥,沙箱到底防住了什么
人工智能·spring·llm
我不会插花弄玉15 分钟前
4.string类型【由浅入深-redis】
数据库·redis·缓存
~光~~2 小时前
【嵌入式linux学习】Cache 策略:Write-Through / Write-Back + Allocation
linux·学习·spring
m0_587383002 小时前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
m0_587383004 小时前
工业场景设备维修维护实战技巧 全流程标准化落地与常见问题排查指南
java·spring·小程序·架构·需求分析
木头科技4 小时前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
范中勤5 小时前
LLM 动态加载与多用户缓存架构技术文档
redis·langchain·llm·缓存架构·多用户隔离
我是人✓5 小时前
Spring IOC注解全解析和Spring整合测试单元
java·后端·spring
小小龙学IT6 小时前
Redis 源码深度解析:从常用命令到内部实现
redis·golang·开源