对于最新的稳定版本,请使用 Spring Data Redis 3.3.1! |
对于最新的稳定版本,请使用 Spring Data Redis 3.3.1! |
Redis 版本 2.6 及更高版本支持通过 eval 和 evalsha 命令运行 Lua 脚本。Spring Data Redis 为运行脚本提供了一个高级抽象,用于处理序列化并自动使用 Redis 脚本缓存。
可以通过调用 和 的方法运行脚本。两者都使用可配置(或)来运行提供的脚本。默认情况下,(或 ) 负责序列化提供的键和参数,并反序列化脚本结果。这是通过模板的键和值序列化程序完成的。还有一个额外的重载,允许您为脚本参数和结果传递自定义序列化程序。execute
RedisTemplate
ReactiveRedisTemplate
ScriptExecutor
ReactiveScriptExecutor
ScriptExecutor
ReactiveScriptExecutor
默认值通过检索脚本的 SHA1 并尝试首先运行来优化性能,如果脚本尚不存在在 Redis 脚本缓存中,则回退到。ScriptExecutor
evalsha
eval
以下示例使用 Lua 脚本运行常见的“检查和设置”方案。这是 Redis 脚本的理想用例,因为它要求以原子方式运行一组命令,并且一个命令的行为会受到另一个命令结果的影响。
@Bean
public RedisScript<Boolean> script() {
ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("META-INF/scripts/checkandset.lua"));
return RedisScript.of(scriptSource, Boolean.class);
}
-
Imperative
-
Reactive
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));
}
}
public class Example {
@Autowired
ReactiveRedisOperations<String, String> redisOperations;
@Autowired
RedisScript<Boolean> script;
public Flux<Boolean> checkAndSet(String expectedValue, String newValue) {
return redisOperations.execute(script, singletonList("key"), asList(expectedValue, newValue));
}
}
-- 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
null
OK
理想的做法是在应用程序上下文中配置单个实例,以避免在每次脚本运行时重新计算脚本的 SHA1。DefaultRedisScript |
理想的做法是在应用程序上下文中配置单个实例,以避免在每次脚本运行时重新计算脚本的 SHA1。DefaultRedisScript |
Spring Data Redis 提供的脚本支持还允许您使用 Spring Task 和 Scheduler 抽象来安排 Redis 脚本以进行定期运行。有关更多详细信息,请参阅 Spring Framework 文档。