質問の大部分は、SpringDataRedisのリファレンスドキュメントに記載されています。
パイプラインを掘り下げる前に、1つのハッシュからの単一のマルチゲットは単一のコマンドであるためパイプラインを必要としません。パイプラインは、Redisインタラクションのパフォーマンス/安定性/…を改善しません。
パイプラインはコールバックとして配置され、結果をすぐに待たずに複数のコマンドを発行することを目的としています。後ですべての結果を取得するバッチと考えてください。パイプラインは最後に応答を同期するため、コールバック内では結果値を受け取りませんが、パイプラインセッションが同期されてexecutePipelined(…)
が行われる最後に結果値を受け取ります。 終了します。
コードは次のようになります。
List<Object> results = getRedisTemplate().executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) {
connection.hMGet(key.getBytes(), params);
return null;
}
});
List<Object> hmget = (List<Object>) results.get(0);
接続がパイプラインモードに入っているため、コールバック引数として受け取った接続のみを使用する必要があります。コールバックの外部から接続を取得する(template.getConnectionFactory().getConnection()
など )新しい接続を開き、応答を待っているRedisコマンドを実行します–取得した外部接続にはパイプラインは適用されません。
RedisTemplate
のメソッドを使用することもできます プレーン接続で作業する代わりに。 executePipelined(…)
コールバックで使用される接続を現在のスレッドにバインドし、テンプレートAPIメソッドを呼び出す場合は、そのバインドされた接続を再利用します。
Luaの質問について:コード/メソッドの呼び出しはLuaに置き換えられません。