Mingyu Kim

Sorted Set - ZipList

Linked List가 데이터 하나를 저장할 때마다 앞뒤를 가리키는 포인터(주소값)를 저장하여 메모리를 낭비하는 문제를 해결하기 위한 구조

포인터를 버리고, 모든 데이터를 하나의 연속된 바이트 덩어리(Byte Array)에 때려 넣는다.

1. ZipList의 내부 메모리 구조

메모리상에서 끊김 없이 쭉 이어진 형태를 가진다. 각 엔트리(데이터)는 자신이 얼마나 큰지, 이전 데이터가 어디서 끝나는지를 기록하여 포인터 없이도 다음 데이터로 이동할 수 있다.

2. Entry(데이터)의 세부 구성

각 엔트리는 앞뒤를 탐색하기 위한 정보를 ‘가변 길이’를 가진다.

3. 치명적인 단점: “연쇄 업데이트”

만약 이전 데이터가 갑자기 커져서 prevlen 자체의 기록 공간(1바이트 -> 5바이트)이 늘어나야 한다면?

이 문제를 해결하기 위해 최신 레디스(7.0+)에서는 ZipList를 폐기하고, 더 안전하고 효율적인 Listpack으로 대체했다.

4. 왜 O(N)인데 쓰는 걸까?