Redis에서 큰 키 문제를 최적화하는 방법
Emily Parker
Product Engineer · Leapcell

Redis 빅 키 문제란 무엇인가?
Redis 빅 키 문제는 키가 많은 양의 메모리를 차지하는 값에 해당하는 시나리오를 의미하며, 이는 성능 저하, 메모리 부족, 데이터 불균형, Redis의 마스터-슬레이브 동기화 지연으로 이어집니다.
키 크기가 얼마나 커야 빅 키로 간주되나요?
빅 키를 정의하는 고정된 기준은 없습니다. 일반적으로 문자열 유형의 값이 1MB를 초과하거나 10,000개 이상의 요소를 포함하는 컬렉션 유형의 키는 빅 키로 간주됩니다.
빅 키에 대한 정의 및 평가 기준은 확정된 것이 아니라 Redis 사용 시나리오 및 비즈니스 요구 사항에 따라 평가해야 합니다. 예를 들어, 높은 동시성, 낮은 지연 시간 시나리오에서는 10KB도 빅 키가 될 수 있는 반면, 낮은 동시성, 높은 용량 환경에서는 빅 키에 대한 임계값이 100KB가 될 수 있습니다. 따라서 Redis를 설계하고 사용할 때 비즈니스 요구 사항 및 성능 지표를 기반으로 합리적인 빅 키 임계값을 결정하는 것이 중요합니다.
빅 키의 영향
- 과도한 메모리 사용량: 빅 키는 상당한 양의 메모리를 소비하여 메모리 부족을 초래하고 제거 정책을 트리거할 수 있습니다. 극단적인 경우 메모리 고갈로 이어져 Redis 인스턴스가 충돌하고 시스템 안정성에 영향을 미칠 수 있습니다.
- 성능 저하: 빅 키는 많은 양의 메모리를 차지하여 메모리 단편화를 증가시키고 Redis 성능에 영향을 미칩니다. 빅 키에 대한 읽기, 쓰기, 삭제와 같은 작업은 더 많은 CPU 시간과 메모리 리소스를 소비하여 시스템 성능을 더욱 저하시킵니다.
- 다른 작업 차단: 빅 키에 대한 특정 작업은 Redis 인스턴스를 차단할 수 있습니다. 예를 들어,
DEL
명령을 실행하여 빅 키를 삭제하면 Redis 인스턴스가 다른 클라이언트 요청에 응답하지 못할 수 있으며, 이는 응답 시간과 처리량에 영향을 미칩니다. - 네트워크 혼잡: 빅 키를 검색하면 많은 양의 네트워크 트래픽이 생성되어 머신 또는 로컬 네트워크 대역폭을 포화시키고 다른 서비스에 영향을 미칠 수 있습니다. 예를 들어 빅 키가 1MB이고 초당 1,000번 액세스되면 1,000MB(1GB)의 트래픽이 생성됩니다.
- 마스터-슬레이브 동기화 지연: 마스터-슬레이브 동기화로 구성된 Redis 인스턴스에서 빅 키는 동기화 지연을 유발할 수 있습니다. 빅 키는 상당한 메모리를 소비하므로 동기화 중에 전송하면 네트워크 지연이 증가하여 데이터 일관성에 영향을 미칩니다.
- 데이터 불균형: Redis 클러스터 모드에서 하나의 데이터 샤드가 다른 샤드보다 훨씬 더 많은 메모리를 소비하면 샤드 간에 균형 잡힌 메모리 사용을 방해합니다. 또한 Redis에 정의된
maxmemory
임계값에 도달하면 중요한 키가 제거되어 메모리 오버플로가 발생할 수 있습니다.
빅 키의 원인
- 잘못된 비즈니스 설계: 이것이 가장 흔한 원인입니다. 단일 키에 많은 양의 데이터를 저장하는 것을 피해야 합니다. 대신 데이터를 여러 키에 분산해야 합니다. 예를 들어, 전국 데이터를 관리 구역에 따라 34개의 키 또는 도시에 따라 300개의 키로 분할하여 빅 키의 가능성을 줄일 수 있습니다.
- 예상치 못한 값 증가: 데이터가 삭제, 만료 또는 크기 제한 없이 값에 계속 추가되면 결국 빅 키가 나타납니다. 예를 들어, 소셜 미디어 플랫폼의 유명인 팔로워 목록 또는 인기 댓글 목록이 있습니다.
- 부적절한 만료 시간 구성: 키에 만료 시간이 없거나 만료 시간이 너무 길면 값의 데이터 양이 시간이 지남에 따라 빠르게 누적되어 빅 키가 발생할 수 있습니다.
- 프로그램 버그: 예기치 않은 상황으로 인해 특정 키가 의도한 것보다 오래 지속되거나 해당 값 크기가 비정상적으로 증가하여 빅 키가 발생할 수 있습니다.
빅 키를 식별하는 방법
SCAN 명령어
Redis SCAN
명령어를 사용하면 데이터베이스의 모든 키를 점진적으로 탐색할 수 있습니다. 다른 명령어(STRLEN
, LLEN
, SCARD
, HLEN
등)와 함께 사용하면 빅 키를 식별할 수 있습니다. SCAN
의 장점은 Redis 인스턴스를 차단하지 않고 탐색할 수 있다는 것입니다.
bigkeys 파라미터
redis-cli
클라이언트를 사용하여 다음 명령을 실행하여 각 데이터 유형에서 가장 큰 키를 스캔할 수 있습니다.
redis-cli -h 127.0.0.1 -p 6379 --bigkeys
Redis RDB 도구
오픈 소스 Redis RDB 도구는 RDB 파일을 분석하여 빅 키를 스캔할 수 있습니다. 예를 들어 다음 명령은 1KB 이상의 메모리를 차지하는 상위 3개의 키를 출력합니다.
rdb --command memory --bytes 1024 --largest 3 dump.rdb
빅 키 문제 해결 방법
- 여러 개의 작은 키로 분할: 가장 간단한 접근 방식은 개별 키의 크기를 줄이는 것입니다.
MGET
을 사용하여 여러 키를 일괄 작업으로 읽을 수 있습니다. - 데이터 압축:
String
유형을 사용할 때 압축 알고리즘을 적용하면 값 크기를 줄일 수 있습니다. 또는 Redis가 압축된 목록 데이터 구조를 사용하여 작은 해시 값을 효율적으로 저장하므로Hash
유형을 사용하는 것이 도움이 될 수 있습니다. - 합리적인 만료 시간 설정: 각 키에 만료 시간을 할당하여 데이터가 만료 시 자동으로 지워지도록 하여 장기간 빅 키로 누적되는 것을 방지합니다.
- 메모리 제거 정책 활성화: **Least Recently Used (LRU)**와 같은 Redis 메모리 제거 전략을 활성화하여 메모리가 부족할 때 가장 적게 사용되는 데이터가 자동으로 제거되도록 하여 빅 키가 무기한으로 메모리를 차지하는 것을 방지합니다.
- 데이터 샤딩: Redis 클러스터를 구현하여 데이터를 여러 Redis 인스턴스에 분산시켜 단일 인스턴스에 대한 부담을 줄이고 빅 키 문제를 완화합니다.
- 빅 키 삭제:
UNLINK
명령을 사용하여 빅 키를 비동기적으로 삭제합니다.DEL
과 달리UNLINK
는 백그라운드에서 키를 제거하므로 Redis 인스턴스가 차단되지 않습니다.
결론
빅 키 문제는 Redis에서 흔히 발생하는 문제로, 성능 저하, 높은 메모리 소비, 작업 차단, 마스터-슬레이브 동기화 지연으로 이어질 수 있습니다. 이 기사에서는 빅 키의 원인, 영향, 탐지 방법 및 해결 방법에 대해 자세히 논의했습니다. 데이터 구조 설계를 최적화하고, 적절한 만료 정책을 설정하고, 시스템 아키텍처 및 구성을 개선하고, 빅 키를 점진적으로 삭제함으로써 빅 키 문제를 효과적으로 완화하고 예방하여 Redis 시스템 안정성 및 성능을 향상시킬 수 있습니다.
Leapcell은 내장된 서버리스 Redis를 통해 백엔드 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무제한 프로젝트를 무료로 배포하세요
- 사용량에 대해서만 지불하세요. 요청도, 요금도 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하세요.
- 예: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 지표 및 로깅.
손쉬운 확장성 및 고성능
- 쉬운 고동시성을 처리하기 위한 자동 확장.
- 운영 오버헤드가 전혀 없습니다. 구축에만 집중하세요.
설명서에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ