Spring Data Redis(Redis Scripting)

来源:互联网 发布:电脑起床闹钟软件 编辑:程序博客网 时间:2024/05/22 04:26

Redis Scripting
Redis脚本

Redis 2.6或更高版本通过eval 和evalsha 命令来支持Lua 脚本的执行。Spring Data Redis 对脚本执行提供了一个高级的抽象封装,处理序列化和自动使用Redis 脚本缓存。

使用RedisTemplate 的execute 方法来运行脚本。RedisTemplate 使用一个可配置的ScriptExecutor 来执行提供的脚本。默认情况下,ScriptExecutor 关注的是:序列化键和参数、反序列化脚本结果。做这些事情还需要RedisTemplate 提供的key和value的序列化器。还提供了另外一个execute 方法,该方法通过传递一个参数来为脚本参数和结果自定义化序列化器。

默认的ScriptExecutor 可以通过以下方式来优化性能:检索脚本的SHA1,尝试先执行evalsha;如果Redis 脚本缓存中没有该脚本则返回来执行eval。

下面示例展示,通过使用Lua 脚本来执行通常的“check-and-set”方案。这是一个完美的Redis 脚本使用方式:自动执行一组命令,一个命令的结果会影响另一个命令的行为。

@Beanpublic RedisScript<Boolean> script() {  DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();  redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("META-INF/scripts/checkandset.lua")));  redisScript.setResultType(Boolean.class);}
public class Example {  @Autowired  RedisScript<Boolean> script;  public boolean checkAndSet(String expectedValue, String newValue) {    return redisTemplate.execute(script, Collections.singletonList("key"), 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

上面的XML 配置了一个指向checkandset.lua 文件的DefaultRedisScript,并期望返回一个boolean 类型的值。脚本的返回类型应该是这些中的一个:Long、Boolean、List 或反序列化值的类型,它也可以是null 如果脚本返回a throw-away status (i.e “OK”)。建议在你的应用上下文中配置一个DefaultRedisScript 的单例,避免在每个脚本执行的时候重复创建脚本的SHA1.

上面checkAndSet 方法执行的scripts,可以在SessionCallback 中执行,作为一个事务或管道的一部分。查看Redis 事务和管道章节可以获得更多的信息。

Spring Data Redis 提供了脚本处理的支持,使用Spring Task和Scheduler 抽象封装,来安排计划Redis 脚本定期执行。要获取更多的信息请查看Spring 框架的文档。

原创粉丝点击