-
레디스(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/