약 3분

SDS 문자열 알아보기

SDS?

Redis/Valkey에서는 문자열을 char * 와 같은 단순 C-Style String 대신 SDS(Simple Data String)로 관리한다. 왜일까?

실제 구현체에서는 추가적인 최적화 로직이 들어가지만 시간복잡도가 O(N)이라는 점은 동일!

일반적인 C-Style String의 경우 문자열의 길이를 알기 위해서는 strlen()과 같은 함수를 사용해야 한다. 그런데 strlen()의 경우 문자열의 끝을 나타내는 null 문자인 \0 을 찾을때까지 포인터를 하나씩 증가시켜가며 탐색하는 O(N) 연산이기 때문에, 대량의 문자열 데이터를 처리해야 하는 서버의 경우 이 연산 비용이 부담스럽기 때문이다.

SDS도 타입상 char * 이긴 하지만, 문자열 앞쪽 메모리 공간에 len, alloc, flags 같은 정보들을 추가로 가지고 있다.

이 SDS를 가리키는 포인터는 실제로 문자열이 담겨있는 buf 영역을 가리키고 있기 때문에 일반적인 C 문자열처럼 사용할 수도 있고, 문자열의 길이가 필요할 경우에는 SDS 내부의 len 값을 활용해 O(1) 연산으로 처리할 수 있다!

실습

SDS를 활용해보기 위해 지난 포스팅에서 추가했던 echodoorcs 명령어를 수정하여, 받은 메시지를 그대로 돌려주는 대신 echo2_ 라는 prefix를 붙여서 되돌려주도록 해보려 한다.

기존 echodoorcs 함수

위처럼 메시지를 그대로 돌려주는 대신 prefix를 붙여줘야 하기 때문에, 전체적인 실행 흐름은 다음과 같다:

  • 새로운 SDS 문자열 만들기
  • argv[1]의 값(SDS)을 꺼내오기
  • echo2_ prefix 붙여주기
  • 응답
수정된 echodoorcs 함수

make clean, make 이후 변경된 echodoorcs 명령어의 동작을 확인해볼 수 있다: