터지기 전에 비워라: 메모리 제한과 키(Key) 규칙
메모리가 가득 찼을 때의 정책과 네임스페이스를 활용한 안전하고 직관적인 Redis 키 이름 짓기 규칙을 익힙니다.
지금까지 TTL로 데이터 수명을 관리하는 법을 배웠지만, 갑작스러운 트래픽 폭주로 메모리가 가득 차는 상황도 완벽히 막을 수는 없습니다. 또한 무작위로 지은 데이터 이름 때문에 기존 데이터를 덮어쓰는 사고가 발생하기도 합니다. 이번 회차에서는 메모리 한계 정책과 키 이름 짓기 규칙을 배웁니다.
최후의 방어선: 메모리 퇴출 정책 (Eviction Policy)
TTL을 잘 설정해 두더라도, 이벤트 기간처럼 데이터 자체가 폭발적으로 늘어나면 할당된 메모리를 초과할 위험이 있습니다. Redis는 자신에게 허용된 메모리 한계치(maxmemory)에 도달했을 때 스스로를 보호하기 위한 방어 메커니즘을 가지고 있습니다. 이를 퇴출 정책(Eviction Policy) 이라고 합니다.
LRU (Least Recently Used) 알고리즘
가장 널리 쓰이는 정책은 올라스트 리센틀리 유즈드(LRU, 가장 오랫동안 사용되지 않은 것) 입니다. 메모리가 꽉 차면, Redis는 저장된 수많은 데이터 중 '가장 오랫동안 아무도 찾지 않은 데이터'를 골라내어 강제로 삭제해 버리고 새로운 데이터가 들어갈 자리를 만듭니다.
대표적인 Redis 메모리 퇴출 정책
| 정책 이름 | 설명 | 주로 쓰이는 상황 |
|---|---|---|
| allkeys-lru | 모든 데이터 중에서 가장 오래 안 쓴 데이터를 삭제 | 일반적인 캐시 용도로 쓸 때 가장 추천 |
| volatile-lru | TTL이 설정된 데이터 중에서 가장 오래 안 쓴 것을 삭제 | Redis에 캐시와 중요한 원본이 섞여 있을 때 |
| noeviction | 아무것도 지우지 않고 새 데이터를 거부함 (에러 발생) | Redis를 캐시가 아니라 메인 DB처럼 중요하게 쓸 때 |
키(Key) 이름 충돌: 보이지 않는 버그
메모리 관리 못지않게 중요한 것이 데이터를 담는 서랍의 이름표, 즉 키(Key) 를 짓는 규칙입니다. 관계형 데이터베이스(PostgreSQL)는 '테이블'이라는 구조가 있어 사용자 데이터와 상품 데이터가 섞이지 않습니다. 하지만 Redis는 거대한 하나의 박스와 같아서 이름이 똑같으면 무조건 기존 데이터를 덮어써 버립니다.
네임스페이스(Namespace)를 활용한 체계적 명명
예를 들어, 1번 사용자의 캐시를 저장할 때 키 이름을 그냥 `1`로 지으면, 나중에 1번 게시글 캐시를 저장할 때 키 이름이 똑같이 `1`이 되어 사용자 데이터가 지워지는 대참사가 발생합니다.
이를 막기 위해 콜론(`:`)을 사용해 폴더처럼 계층을 나누는 네임스페이스 기법이 전 세계적인 표준으로 사용됩니다.
안전한 Redis 키(Key) 명명 규칙
권장
- 업무도메인:세부항목:식별자 형태로 짓기 (예: user:profile:1)
- 의미를 명확히 알 수 있는 영어 단어 사용하기
- 프로젝트 이름을 가장 앞에 붙여 여러 앱의 충돌 막기 (예: myshop:cart:123)
주의
- 단순한 숫자나 ID만 덜렁 쓰기 (예: 1, 123)
- 의미를 알 수 없는 암호 같은 이름 쓰기 (예: a1, temp_data)
- 공백문자나 특수기호를 키 이름에 마구잡이로 넣기
키 충돌과 안전한 키 네이밍 예시
// ❌ 매우 위험한 방식: 키 이름이 겹쳐서 데이터가 덮어써질 수 있습니다.
await redisClient.set('42', JSON.stringify(userData));
await redisClient.set('42', JSON.stringify(productData)); // 사용자 데이터가 날아감!
// ✅ 권장되는 방식: 콜론(:)을 이용해 계층을 분리합니다.
await redisClient.set('user:profile:42', JSON.stringify(userData));
await redisClient.set('product:detail:42', JSON.stringify(productData));개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.Redis 메모리가 가득 찼을 때, 가장 오랫동안 조회되지 않은 데이터를 강제로 지워 공간을 확보하는 대표적인 퇴출 정책(Eviction Policy)은 무엇인가요?
3줄 요약
- 1데이터가 폭주해 한계 메모리(maxmemory)에 도달하면 Redis는 퇴출 정책(Eviction)을 작동시킵니다.
- 2일반적으로 가장 오래 쓰지 않은 데이터를 버리는 LRU 정책을 통해 시스템 다운을 막고 서비스가 멈추지 않게 합니다.
- 3데이터가 뒤섞여 덮어써지는 사고를 막기 위해 키 이름에 콜론(:)을 넣어 user:profile:1 처럼 구조화해야 합니다.