피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
개발자가 알면 좋은 Redis 꿀팁 모음
올리브영 커뮤니티 서비스 개발팀이 Redis TTL 설정, Big Key 회피, Hash 타입 활용으로 메모리 낭비와 성능 저하 문제 해결
AI 요약
Context
Redis 도입 초기 단계에서 TTL 미설정으로 인한 메모리 고갈(OOM) 위험, 10MB 이상의 대용량 데이터를 단일 키에 저장하면서 발생한 네트워크 포화 및 메모리 단편화, 그리고 직렬화된 객체 저장으로 인한 스키마 변경 시 역직렬화 오류 문제가 있었다.
Technical Solution
- 모든 Redis 데이터에 TTL(Time-To-Live) 설정: 메모리 자동 정리, 캐시 정합성 유지, 장애 시 쓰레기 데이터 자동 삭제 구현
- Big Key 문제 회피: 1MB 초과 문자열 또는 10,000개 이상 요소를 포함한 컬렉션 타입 키 저장 금지로 메모리 단편화 및 과도한 네트워크 트래픽 방지
- Redis Sorted Set 활용: 유저 행동 데이터의 timestamp를 score로 변환해 시간순 정렬 구현, 추천 피드 구성에 활용
- Redis Hash 타입으로 객체 저장: 직렬화 대신 HSET 명령어로 필드별 저장, 스키마 추가/삭제 시 하위 호환성 유지
- 핫키(Hot Key) TTL 만료 시 대비: 백그라운드 주기적 갱신 또는 Probabilistic Early Recomputation(PER) 알고리즘 적용으로 원본 DB 부하 집중 방지
Impact
아티클에 정량적 성능 수치가 명시되지 않음. 부작용 사례로 단일 String 키에 10MB 데이터 저장 시 네트워크 트래픽이 1000MB/s(1GB/s) 발생 가능함을 언급.
Key Takeaway
Redis 활용 시 TTL 설정, Big Key 회피, 적절한 Data Type 선택(Sorted Set, Hash)은 메모리 효율성과 시스템 안정성을 동시에 보장하는 필수 설계 원칙이며, 핫키 만료로 인한 캐시 스탬피드 현상을 미리 예방하는 것이 전체 시스템 장애를 방지하는 핵심이다.
실천 포인트
Redis를 캐싱 또는 세션 관리에 사용하는 백엔드 서비스에서 모든 데이터에 TTL을 설정하고, 객체를 String으로 직렬화하지 않고 Hash 타입으로 필드별 저장하며, 요청이 집중된 캐시 키에 대해 PER 알고리즘(주기적 배경 갱신 또는 확률 기반 갱신)을 적용하면 메모리 고갈, 스키마 변경 오류, 캐시 스탬피드로 인한 DB 과부하를 동시에 방지할 수 있다.