Spring Data Redis(Redis Scripting)

本文介绍如何使用Spring Data Redis在Redis中执行Lua脚本,包括配置DefaultRedisScript、执行check-and-set操作及优化性能的方法。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值