오픈소스 인사이트
home
오픈소스 기술 동향
home
⚠️

Redis 메모리, Eviction 정책으로 알차게 쓰는 법

7 more properties

Redis 메모리 관리

Redis는 인메모리 기반 key-value 데이터 저장소로, 캐시부터 세션 저장소까지 다양한 곳에서 많이 활용되고 있습니다.
하지만 운영하다 보면 “왜 메모리가 이렇게 빨리 차지?” 또는 “eviction 정책은 뭘 써야 하지?” 같은 고민이 생기기 마련이죠.

Redis 메모리 관리의 핵심 포인트를 쉽게, 실무자들의 실수에 도움이 되도록 알려드리겠습니다.

메모리 이슈 사례

Redis는 메모리에 데이터를 저장하기 때문에, 메모리 용량을 초과하는 순간 다양한 이슈가 발생할 수 있습니다. 운영체제(OS)에서 Swap을 어떻게 설정했는지에 따라 결과가 크게 달라지는데요, 대표적으로 두 가지 사례를 소개합니다.

이슈 사례 1: Swap 메모리 사용

Swap 메모리를 설정하면 실제 메모리가 부족할 때 시스템이 다운되거나 프로세스가 멈추는 현상(Hang)을 막을 수 있어 안정성은 높아집니다.
하지만 디스크 공간을 메모리처럼 사용하다 보니 속도가 크게 저하되고, 결국 Redis의 장점인 빠른 응답성을 해칠 수 있습니다.

이슈 사례 2: Swap 미사용 시 OOM 에러

반대로 Swap을 아예 두지 않은 상태에서 Redis가 maxmemory보다 더 많은 데이터를 사용하면,
Application 로그에서 OOM command not allowed when used memory > 'maxmemory’ 와 같은
Out of Memory(OOM) 에러가 발생합니다.

그렇다면, Redis는 메모리를 어떻게 관리할까요?

Redis는 기본적으로 사용할 수 있는 메모리 용량을 넘어가면 문제가 생깁니다.
이를 방지하기 위해, Redis가 사용하는 최대 메모리를 설정할 수 있는 maxmemory옵션이 있습니다.
이 파라미터의 값을 지정해두면 Redis가 그 이상 메모리를 사용하지 않도록 제한할 수 있습니다.
그럼에도 불구하고, 서비스 중 트래픽이 발생하면 데이터는 계속 들어올 것입니다.
이때 Redis는 단순히 “용량이 찼으니 더 이상 못 넣어요”라고 멈추지 않습니다. 대신, 기존 데이터를 일부 제거하면서 새로운 데이터를 받아들이는 방식으로 동작하는데, 이 과정을 “eviction (데이터 제거)”이라고 부릅니다.
어떤 데이터를 먼저 지우고 아니면 어떤 데이터를 남길지는 바로 maxmemory-policy 옵션을 통해 eviction 정책을 만들 수 있습니다.

Redis에서 eviction이 필요한 이유

Redis는 모든 데이터를 메모리(RAM)에 보관합니다.
그래서, 디스크 기반 DB처럼 느려지지 않고 초고속 응답이 가능합니다.
하지만, 메모리는 한정된 자원이기 때문에, 다음과 같은 상황이 발생할 수 있습니다.
캐시 서버로 사용하는데 데이터가 계속 쌓임
TTL이 걸려 있어도 단기간에 급격히 데이터 증가
세션이나 토큰 관리 같은 유효 기간 데이터가 폭발적으로 늘어남

Redis의 주요 eviction 정책 한눈에 보기

noeviction : 메모리가 차면 더 이상 데이터를 저장하지 않고, 새로운 쓰기 요청 시 에러 반환
allkeys-lru : 전체 key 중 최근에 사용되지 않은 key를 삭제
allkeys-lfu : 전체 key 중 가장 사용 빈도가 낮은 key를 삭제
allkeys-random : 전체 key 중 무작위로 삭제
volatile-lru : TTL이 설정된 key 중 최근에 사용되지 않은 key를 삭제
volatile-lfu : TTL이 설정된 key 중 사용 빈도가 낮은 key를 삭제
volatile-random : TTL이 설정된 key 중 무작위로 key를 삭제
volatile-ttl : TTL이 설정된 key 중 만료가 가장 가까운 key를 삭제

maxmemory-policy, 어떤 걸 쓸까?

메모리가 꽉 찼을 때 Redis가 어떤 행동을 취할지는 maxmemory-policy 설정에 달려 있습니다.
Redis는 인메모리 데이터 저장소이기 때문에, 메모리의 한계를 넘어서는 순간 성능 이슈명령 실패 같은 문제가 발생할 수 있습니다.
이를 방지하기 위해 Redis는 특정 기준에 따라 일부 데이터를 제거(eviction)하는데, 그 방식을 정의하는 설정이 바로 maxmemory-policy입니다.
아래와 같이 두 접두사는 삭제 대상 범위를 구분합니다.
allkeys-* : 모든 key를 대상으로 삭제
→ TTL이 있든 없든 상관없이 고려
volatile-* : TTL이 설정된 key만 대상으로 삭제
→ TTL이 없는 key는 절대 삭제되지 않음
따라서, maxmemory-policy 의 각 정책은 “어떤 데이터를 제거할지”에 대한 기준이 다르며, 서비스의 성격이나 데이터의 특성에 따라 적합한 방식이 달라집니다.

마무리하며

Redis 메모리 관리라고 해서 복잡할 필요는 없습니다.
핵심은 maxmemory 설정 + eviction 정책 선택입니다.
단순히 데이터를 지우는 방식이 아니라, 서비스의 데이터 성격과 운영 목적에 따라 달라지는 전략적 선택이라고 볼 수 있으며, 메모리 관리 전략을 세우는 것이 핵심입니다.

참고자료

https://redis.io/docs/latest/develop/reference/eviction/
김남욱 프로
클라우드와 오픈소스 SW 관련 연구 개발 프로젝트들을 진행해왔고, 지금은 OSS 기술서비스와 아키텍처를 담당하고 있어요