陇西 网站建设,商丘关键词优化推广,邢台做网站找谁,网站代运营收费【Spring连载】使用Spring Data访问Redis#xff08;十#xff09;----Lua脚本支持Scripting Redis 2.6及更高版本支持通过eval 和 evalsha 命令运行Lua脚本。Spring Data Redis为运行处理序列化的脚本提供了高级抽象#xff0c;并自动使用Redis脚本缓存。 脚本可以通过调用… 【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运行一组命令并且一个命令的行为会受到另一个命令结果的影响。 Bean
public RedisScriptBoolean script() {ScriptSource scriptSource new ResourceScriptSource(new ClassPathResource(META-INF/scripts/checkandset.lua));return RedisScript.of(scriptSource, Boolean.class);
}public class Example {AutowiredRedisOperationsString, String redisOperations;AutowiredRedisScriptBoolean script;public 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或反序列化的值类型之一。如果脚本返回丢弃(throw-away)状态特别是OK它也可以为null。 最好在应用程序上下文中配置DefaultRedisScript的单个实例以避免在每次运行脚本时重新计算脚本的SHA1。 然后上面的checkAndSet方法运行脚本。脚本可以作为事务或管道的一部分在SessionCallback中运行。有关更多信息请参阅“Redis事务”和“Redis管道 pipeline”。 Spring Data Redis提供的脚本支持还允许您使用Spring Task和Scheduler抽象来安排Redis脚本定期运行。有关更多详细信息请参阅Spring Framework文档。