スクリプト

Redis バージョン 2.6 以降は、eval (英語) および evalsha (英語) コマンドを介した Lua スクリプトの実行をサポートします。Spring Data Redis は、直列化を処理し、Redis スクリプトキャッシュを自動的に使用するスクリプトを実行するための高レベルの抽象化を提供します。

スクリプトは、RedisTemplate および ReactiveRedisTemplate の execute メソッドを呼び出すことで実行できます。どちらも、提供されたスクリプトを実行するために構成可能な ScriptExecutor (Javadoc) (または ReactiveScriptExecutor (Javadoc) ) を使用します。デフォルトでは、ScriptExecutor (Javadoc) (または ReactiveScriptExecutor (Javadoc) ) は、提供されたキーと引数の直列化とスクリプトの結果のデ直列化を行います。これは、テンプレートのキーと値のシリアライザーを通じて行われます。スクリプトの引数と結果にカスタムシリアライザーを渡すことができる追加のオーバーロードがあります。

デフォルトの ScriptExecutor (Javadoc) は、スクリプトの SHA1 を取得し、最初に evalsha の実行を試み、スクリプトが Redis スクリプトキャッシュにまだ存在しない場合は 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);
}
  • 命令的

  • リアクティブ

public class Example {

  @Autowired
  RedisOperations<String, String> redisOperations;

  @Autowired
  RedisScript<Boolean> script;

  public boolean checkAndSet(String expectedValue, String newValue) {
    return redisOperations.execute(script, List.of("key"), 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, List.of("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

上記のコードは、ブール値を返すことが期待される checkandset.lua というファイルを指す RedisScript (Javadoc) を構成します。スクリプト resultType は、LongBooleanList のいずれか、デシリアライズされた値型である必要があります。スクリプトがスローアウェイステータス (具体的には OK) を返す場合は、null にすることもできます。

スクリプトを実行するたびにスクリプトの SHA1 が再計算されないように、アプリケーションコンテキストで DefaultRedisScript の単一インスタンスを構成することが理想的です。

上記の checkAndSet メソッドはスクリプトを実行します。スクリプトは、トランザクションまたはパイプラインの一部として SessionCallback (Javadoc) 内で実行できます。詳細については、"Redis トランザクション" および "パイプライン" を参照してください。

Spring Data によって提供されるスクリプトサポート Redis では、Spring タスクおよびスケジューラーの抽象化を使用して、Redis スクリプトを定期的に実行するようにスケジュールすることもできます。詳細については、Spring Framework のドキュメントを参照してください。