ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 레디스(Redis) 한 번에 여러 명령어 호출 시 파이프라인 및 트랜잭션
    Redis 2019. 3. 8. 18:07

    Redis의 경우 Client에서 Command를 실행 시  Redis Server와  TCP로 통신하기 때문에 간단한 키, 값 데이터를 여러번 반복해서 등록할 경우 다수의 TCP 통신 과정에서 오버헤드가 발생하여 latency가 지연될 수 있다.

    이 경우 Redis에서는 한번에 여러 명령어를 파이프라인으로 실행하여 결과 값을 한번에 배열 등으로 리턴 받을 수 있는데 Spring RedisTemplate 에서는 아래와 같은 방법으로 사용할 수 있다. 

    아래는 한번에 여러명령어를 실행하는 예제이다.

    //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;
                }
            });

    또는 아래와 같이 파이프라인 역할 뿐만 아니라 아래는 트랜잭션으로 특정 키값의 데이터가 변경되는지 확인하여 트랜잭션 작업 중 해당 키값의 데이터가 변경 되었을 경우 트랜잭션 내에서 실행한 내용을 취소 처리하게 된다.

     

    redisTemplate.execute(
            new SessionCallback<Object>() {
                @Override
                public Object execute(RedisOperations operations) throws DataAccessException {
                    operations.watch("myKey"); // myKey값 변경 체크
                    operations.multi(); // 트랜잭션 Start
                    for (int i=0; i<10000; i++) {
                        operations.opsForValue().increment("mykey", 1);
                    }
                    operations.exec(); // 트랜잭션 Commit
                    return null;
                }
            });

     

    * 참고: https://docs.spring.io/spring-data-redis/docs/current/reference/html/

    댓글

Designed by Tistory.