パイプライン

Redis は、パイプライン化 (英語) のサポートを提供します。これには、応答を待たずにサーバーに複数のコマンドを送信し、単一のステップで応答を読み取ることが含まれます。パイプライン処理は、同じリストに多くの要素を追加するなど、複数のコマンドを連続して送信する必要がある場合にパフォーマンスを向上させることができます。

Spring Data Redis は、パイプラインでコマンドを実行するためのいくつかの RedisTemplate メソッドを提供します。パイプライン操作の結果を気にしない場合は、標準の execute メソッドを使用して、pipeline 引数に true を渡すことができます。次の例に示すように、executePipelined メソッドは、提供された RedisCallback または SessionCallback をパイプラインで実行し、結果を返します。

//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
  new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
      for(int i=0; i< batchSize; i++) {
        stringRedisConn.rPop("myqueue");
      }
    return null;
  }
});

前の例では、パイプラインのキューからアイテムを一括して右ポップします。resultsList には、ポップされたすべてのアイテムが含まれます。RedisTemplate は、値、ハッシュキー、ハッシュ値シリアライザーを使用して、結果を返す前にすべての結果を逆直列化するため、前の例で返されるアイテムは文字列です。パイプライン化された結果にカスタムシリアライザーを渡すことができる追加の executePipelined メソッドがあります。

パイプライン化されたコマンドの結果を返すためにこの値は破棄されるため、RedisCallback から返される値は null である必要があることに注意してください。

Lettuce ドライバーは、コマンドが表示されたときにコマンドをフラッシュしたり、バッファリングしたり、接続のクローズ時にコマンドを送信したりできる、きめの細かいフラッシュ制御をサポートしています。

LettuceConnectionFactory factory = // ...
factory.setPipeliningFlushPolicy(PipeliningFlushPolicy.buffered(3)); (1)
1 ローカルでバッファリングし、3 番目のコマンドごとにフラッシュします。
パイプラインは Redis スタンドアロンに制限されます。Redis クラスターは現在、クロススロットキーを使用する場合の次のコマンドを除き、Lettuce ドライバーを通じてのみサポートされています: renamerenameNXsortbLPopbRPoprPopLPushbRPopLPushinfosMovesIntersInterStoresUnionsUnionStoresDiffsDiffStore。同一スロットキーは完全にサポートされています。