2017-09-20 8 views
0

私は指定されたフィールドだけで複数のハッシュマップ値を取得したいと思います。だから、私はRedisのパイプラインを選んだ。春のデータRedis:Redisパイプライン常にnullを返す

以下のコードをテストしているうちに、私はredisResponse1が常にヌルであると見ています。ここではredisResponse2に値があります。

getRedisTemplate().executePipelined(new RedisCallback<Object>() { 
     @Override 
     public Object doInRedis(RedisConnection connection) throws DataAccessException { 
       List<byte[]> redisResponse1 = connection.hMGet(key.getBytes(), params); 
       List<byte[]> redisResponse2 = getRedisTemplate().getConnectionFactory().getConnection().hMGet(key.getBytes(), specificParams); 
       return null; 
     } 
    }); 

Iコードを調べて、その下に、見つかった場合

A)redisResponse2がパイプラインオプションで実行されない

B)redisResponse1がパイプラインで実行される(isPipelined()== TRUE)常にnullを返します。

public List<byte[]> hMGet(byte[] key, byte[]... fields) { 
    try { 
     if (isPipelined()) { 
      pipeline(new JedisResult(pipeline.hmget(key, fields))); 
      return null; 
     } 
     if (isQueueing()) { 
      transaction(new JedisResult(transaction.hmget(key, fields))); 
      return null; 
     } 
     return jedis.hmget(key, fields); 
    } catch (Exception ex) { 
     throw convertJedisAccessException(ex); 
    } 
} 

だから、質問は

1です)どのように私は、パイプラインオプションを使用して私のユースケースを実現するのですか?

2)このRedisCallback内でgetRedisTemplate().getConnectionFactory().getConnection()にアクセスするとどのような影響がありますか?

3)このパイプライン全体のコンセプトはどのように機能していますか?それは動的なルアのようですか?このJavaコードはLuaスクリプトとして変換され、Redisにスクリプトとして送信され、Redisで実行されて戻ってきますか?このコールバック内で驚いた。コードは外部クラス変数にもアクセス/更新しています。そのため、すべての変数に何が起こりますか?これらの外部クラス変数はすべて、luaのredisにも送信されますか?

4)多くの例があります。doInRedis APIはnullです。なぜそうなのか?それから有効なオブジェクトを返す/取得する方法?

+0

spring-data-redis-1.6.6.RELEASE.jarを使用する –

答えて

1

多くのご質問は、Spring Data Redis reference documentationでご利用いただけます。

パイプライニングを掘り起こす前に、1つのハッシュから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に移りません。

+0

plus1私はドキュメントを読んで戻ってきます。 –

+0

はい、これは私の問題を解決しました。 –

関連する問題