본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
강의 내용
이번 강의에서는 Redis의 핵심 데이터 구조 중 가장 기본이 되는 String 타입을 중심으로 Redis의 key-value 구조와 다양한 데이터 타입에 대해 학습했다.
Redis가 제공하는 데이터 타입:
- String
- Lists
- Sets
- Sorted Sets
- Hashes
- Geospatial
- Bitmap
강의에서는 String이 단순한 문자열 저장소가 아닌, Redis의 모든 값을 담는 범용적인 컨테이너 역할을 한다는 점을 강조했다.
키-값 매핑
Redis는 해시 테이블을 이용해 키-값 쌍을 저장한다. 해시 테이블 요소에는 키-값 쌍에 대한 포인터를 보유한다. 키는 문자열로 저장되고 값은 다양한 데이터 타입(Strings, List, Hashes, Sets, Sorted Sets)이다.

값 타입
문자열 유형에는 단 하나의 구현, SDS(단순 동적 문자열)가 있다. List, Hash, Set 및 SortedSet은 모두 두 가지 유형의 구현을 가지고 있다.
아래 다이어그램은 Redis가 공통 데이터 구조를 구현하는 방법이다.

- Redis 7.0은 List 구현을 quicklist로 변경했으며 ZipList는 listpack으로 대체되었다고 한다.
5가지 기본 데이터 구조 외에도 Redis는 더 많은 데이터 구조를 추가했다. 이러한 데이터 유형은 웹사이트의 대부분의 사용을 다룬다.
- Geospatial data : Uber 같은 애플리케이션에서 사용할 수 있는 좌표를 저장한다.
- HyperLogLog : 대규모 웹 사이트의 고유 방문자를 계산한다.
- Stream : 메시지 대기열에 사용되며 List의 문제를 보완한다.
아래 다이어그램은 기본 데이터 구조 및 사용 시나리오에서 허용되는 작업을 나열한다.

SDS(Simple Dynamic Strings)
Redis는 C언어로 구현한 인메모리 Key-Value 데이터베이스이다. 그렇다면 C언어를 사용하며 문자열을 구현해야 한다고 생각해보자. C에 대한 경험이 있다면, Char * 나 표준 C 라이브러리인 libc를 떠올릴 것이다. 그런데 Redis를 만든 살바토르 산필리포는 Redis String을 구현할 때 libc를 사용하지 않고 직접 문자열 라이브러리를 만들었다. 이게 바로 SDS(Simple Dynamic Strings)라는 라이브러리다.
왜 libc를 사용하지 않고 왜 문자열 라이브러리를 다시 만들게 되었을까? Redis는 Binary Safe한 특징을 가진다.
모든 데이터를 담을 수 있어 mp4와 같은 비정형 데이터도 저장할 수 있다. 따라서 String에 특수 문자, NULL 을 문자열에 포함할 수 있어야 한다. libc를 이용해 Redis String을 구현한다면 여기서 문제를 마주하게 된다.
C의 char* 로 String을 구현하면 Binary Safe하지 않는다. 이 이유는 NULL값을 Null-terminated string으로 인식하기 때문이다.
NULL(“\0”)값이 들어간 “roharon\0” 문자열을 저장하는 경우엔 아래와 같이 저장된다. 또한 문자열 크기 확인하려면 Null-terminated string을 발견할 때 까지 카운트 해야한다. O(n)의 시간복잡도를 가지며 성능 저하의 요인이 된다. SDS에선 표준 C 라이브러리인 libc에서 힙 할당 문자열을 추가하면서 사용하기 쉽고, Binary Safe하며, 더 효율적으로 계산 처리하고, C언어 문자열 함수와 호환되게 하였다.
- 길이 조회 : O(n) -> O(1)
- 버퍼 오버플로우 방지
- 바이너리 데이터 안전하게 저장
- 효율적인 메모리 사전 할당

SDS 속성 정보
- header: 메타데이터 정보
- free: 사용 가능한 여유 공간
- len: 문자열의 길이
- buffer: 실제 데이터가 저장되는 버퍼
- 널 종료 강제가 아니다.
참고 출처
- https://publish.obsidian.md/this-is-spear/%EB%A0%88%EB%94%94%EC%8A%A4/0.+%EB%B0%94%EC%9D%B4%ED%8A%B8%EB%B0%94%EC%9D%B4%ED%8A%B8%EA%B3%A0+-+%EB%A0%88%EB%94%94%EC%8A%A4+%EB%8B%A8%EA%B8%B0+%EC%86%8D%EC%84%B1+%EC%A0%95%EB%A6%AC
- https://redis.io/docs/latest/develop/data-types/strings/



