Redis JSON RAM 사용량
Redis JSON RAM 사용량 (Redis JSON RAM Usage) (ram-2)
Redis JSON이 메모리를 얼마나 쓰는지 궁금하시죠? 이 페이지에서는 JSON 값 하나하나가 RAM을 어떻게 소비하는지, 특히 JSON.DEBUG MEMORY 명령으로 메모리 사용량을 디버깅하는 방법을 옆에서 설명드릴게요.
지속적인 기능 추가와 개선, 최적화 때문에 JSON 메모리 소비량은 Redis 버전에 따라 달라질 수 있어요. 이 페이지의 예제는 Redis Open Source의 Redis 8에서 측정됐습니다.
모든 Redis 키는 메모리를 차지해요. 키 이름을 저장할 RAM은 물론, Redis가 쓰는 키당 오버헤드도 최소한으로 필요하죠. 그 위에 키의 값도 RAM을 요구해요.
JSON 값이 메모리를 쓰는 방식 (How JSON values consume memory)
Redis JSON은 역직렬화(deserialization) 후 JSON 값을 바이너리 데이터로 저장해요. 이 표현은 크기 면에서 직렬화된 형태보다 종종 더 비싼 편이에요. 모든 JSON 값은 (64비트 아키텍처에서) 최소 8바이트를 차지합니다. 각 값이 포인터를 감싸는 얇은 래퍼로 표현되기 때문이죠. 타입 정보는 포인터의 하위 비트에 저장되는데, 정렬(alignment) 제약 때문에 그 비트는 항상 0으로 보장되어요. 그래서 그 비트를 보조 데이터를 저장하는 데 재활용할 수 있어요.
일부 JSON 값 타입은 8바이트면 충분해요. null과 boolean은 추가 저장 공간이 전혀 필요 없어요. 작은 정수는 자주 쓰이기 때문에 정적 메모리에 저장되므로 역시 처음 8바이트만 사용해요. 마찬가지로 빈 문자열, 배열, 객체는 정리를 위한 추가 공간이 필요 없어요. 대신 정적 인스턴스인 null 문자열, 배열, 객체를 가리킬 뿐이죠. 다음은 JSON.DEBUG MEMORY 명령으로 메모리 소비를 보고하는 예시예요.
127.0.0.1:6379> JSON.SET boolean . 'true'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY boolean
(integer) 8
127.0.0.1:6379> JSON.SET null . null
OK
127.0.0.1:6379> JSON.DEBUG MEMORY null
(integer) 8
127.0.0.1:6379> JSON.SET emptystring . '""'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY emptystring
(integer) 8
127.0.0.1:6379> JSON.SET emptyarr . '[]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY emptyarr
(integer) 8
127.0.0.1:6379> JSON.SET emptyobj . '{}'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY emptyobj
(integer) 8
이 RAM 요구량은 모든 스칼라 값에 동일하지만, 문자열은 길이에 따라 추가 공간이 필요해요. 예를 들어 3글자 문자열은 3바이트를 추가로 씁니다.
127.0.0.1:6379> JSON.SET foo . '"bar"'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY foo
(integer) 11
JSON 문자열 재사용 메커니즘 (JSON string reuse mechanism)
기능 추가와 최적화로 인해 JSON 메모리 소비량은 버전마다 달라질 수 있어요. Redis JSON은 값의 크기를 줄이기 위해 JSON 문자열 재사용 메커니즘을 사용합니다. 짧거나 자주 사용되는 문자열은 매번 새로 할당하기보다 재사용되어 메모리를 절약하죠. (확인 필요: 원문의 문자열 재사용 메커니즘 상세 설명)
다음 네 예시에서 각 배열은 56바이트를 요구해요. 이렇게 나뉘어요.
- 초기 배열 값 포인터 8바이트
- 메타데이터 16바이트: 할당된 용량 8바이트와 배열의 시점(point-in-time) 크기 8바이트
- 배열 32바이트: 배열의 초기 용량은 4이므로
4 * 8바이트로 계산
127.0.0.1:6379> JSON.SET arr . '[""]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 56
참고: 배열 예시의 정확한 상세 수치와 이후 예시는 원문을 참고하세요. (확인 필요: 원문의 추가 배열/객체 예시)