Redis pipelining 성능 개선

steve·2023년 12월 21일
0

Backend

목록 보기
7/17

목표

  • Redis 다중 처리 시 성능을 개선할 수 있는 pipelining 기능에 대해 알아보고 적용해본다

Redis pipelining 개요

  • Redis 명령을 일괄 처리하여 다중 처리가 필요한 경우 네트워크 왕복 시간을 최적화하는 방법
  • pipeline 적용 결과 비교

예시 코드

  • pipeline 적용 전 코드
    • set 3회, rpush 1회 각각 요청
      async setStore(accessToken, refreshToken, users) {
          const expireResult = await this.cache.set(
            `expire-${users.uid + accessToken}`,
            users.uid,
            'EX',
            this.authConf.signOutAuto,
          );
          const atResult = await this.cache.set(
            `at-${users.uid + accessToken}`,
            JSON.stringify(users),
            'EX',
            this.authConf.sign.expires,
          );
          const rtResult = await this.cache.set(
            `rt-${users.uid + refreshToken}`,
            accessToken,
            'EX',
            this.authConf.resign.expires,
          );
          // For Session Limit
          const sessionResult = await this.cache.rpush(
            `session-${users.uid}`,
            `${accessToken}/${refreshToken}`,
          );
      
          return expireResult === 'OK' && atResult === 'OK' && rtResult === 'OK' && sessionResult > 0;
        }
  • pipeline 적용 후 코드
    • pipeline으로 한번에 처리
      async setStore(accessToken, refreshToken, users) {
          const pipeline = this.cache.pipeline();
          pipeline.set(
            `expire-${users.uid + accessToken}`,
            users.uid,
            'EX',
            this.authConf.signOutAuto,
          );
          pipeline.set(
            `at-${users.uid + accessToken}`,
            JSON.stringify(users),
            'EX',
            this.authConf.sign.expires,
          );
          pipeline.set(
            `rt-${users.uid + refreshToken}`,
            accessToken,
            'EX',
            this.authConf.resign.expires,
          );
          // For Session Limit
          pipeline.rpush(
            `session-${users.uid}`,
            `${accessToken}/${refreshToken}`,
          );
          const results = await pipeline.exec();
      
          // pipeline 처리 결과 기존 로직 대비 8ms -> 2ms로 성능 향상
          const error = results.some((result) => !(result[1] === 'OK' || result[1] > 0));
          return !error;
      }

시간 소요 차이

  • pipeline 적용 전
    • 평균 약 8ms 소요
  • pipeline 적용 후
    • 평균 약 2ms 소요

결론

  • 다중 redis 처리 요청 시, pipeline으로 한 번에 요청하여 성능 최적화를 기대할 수 있음
  • 위 테스트 케이스에서 실제 적용 결과 4배의 성능 개선 되었음 (local 환경 테스트)
  • 실제 서버 배포 환경처럼 API 서버와 Redis 서버 간 네트워크 구간이 더 복잡할 경우 더 큰 폭으로 성능 개선 될 것으로 예상됨

참고

https://redis.io/docs/manual/pipelining/
https://dev.to/jilcimar/performance-no-redis-com-pipelining-2ocg

0개의 댓글

관련 채용 정보