Spring Data Redis(Redis Scripting)

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 脚本使用方式:自动执行一组命令,一个命令的结果会影响另一个命令的行为。

@Bean
public 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 框架的文档。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值