2017-09-20 8 views
0

지정된 필드가있는 여러 해시 맵 값을 검색하고 싶습니다. 그래서 저는 Redis 파이프 라인을 선택했습니다.스프링 데이터 Redis : Redis 파이프 라인 항상 null을 반환

아래의 코드를 테스트하는 동안 redisResponse1은 항상 null 인 것으로 나타났습니다. 여기에는 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; 
     } 
    }); 

나는 코드로보고 그 아래에, 발견 한 곳

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에서 실행되고 다시 돌아옵니다. 이 콜백 내에서 놀랐습니다. 코드는 외부 클래스 변수에도 액세스/업데이트하므로 모든 변수에 어떤 영향이 있습니까? 이러한 모든 외부 클래스 변수도 루아에서 redis로 전송됩니까?

4) 많은 예제가 있습니다. doInRedis API가 null을 반환합니다. 왜 그렇게? 반환하는 방법/그 유효한 개체를 얻을?

+0

spring-data-redis-1.6.6.RELEASE.jar을 사용하여 –

답변

1

대부분의 질문은 Spring Data Redis reference documentation에서 확인할 수 있습니다.

파이프 라이닝을 파기 전에 하나의 해시에서 하나의 멀티 가져 오기는 파이프 라이닝이 필요하지 않습니다. 이는 단일 명령이기 때문입니다. 파이프 라이닝은 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 메소드를 호출하는 경우 해당 바인드 연결을 재사용합니다.

루아 질문에 관해서 : 코드/메소드 호출은 루아로 대체되지 않습니다.

+0

plus1 확인을 클릭하고 설명서를 읽고 돌아 오도록하겠습니다. –

+0

예, 문제가 해결되었습니다. –