증상 — 에러 메시지
OOM command not allowed when used memory > 'maxmemory'.
ERR command not allowed when used memory > 'maxmemory'
캐시 서버로 Redis를 운영하다 보면 어느 날 갑자기 쓰기 명령이 전부 실패하는 상황을 만납니다. OOM(Out of Memory) 에러는 Redis가 설정된 최대 메모리 한도에 도달했을 때 발생하며, 기본 정책(noeviction)에서는 새 데이터를 추가할 수 없습니다.
원인
Redis는 기본적으로 maxmemory 제한이 없어서 서버 물리 메모리를 모두 소모할 수 있습니다. 운영 환경에서 명시적으로 제한을 걸면, 그 한도를 넘는 순간 maxmemory-policy 설정에 따라 동작이 결정됩니다. 기본값인 noeviction은 메모리가 가득 차면 쓰기 에러를 반환합니다.
해결방법
1. maxmemory 및 정책 설정
# redis.conf 파일 수정
maxmemory 2gb
maxmemory-policy allkeys-lru
# 또는 런타임에 즉시 적용 (재시작 불필요)
redis-cli CONFIG SET maxmemory 2gb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
# 설정 확인
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
2. Eviction Policy 종류와 용도
# noeviction (기본): 메모리 초과 시 쓰기 에러 반환
# allkeys-lru : 모든 키 중 LRU 순서로 삭제 — 순수 캐시에 권장
# volatile-lru : TTL 있는 키 중 LRU 순서로 삭제 — 혼합 환경
# allkeys-lfu : 사용 빈도 낮은 키 삭제 — Redis 4.0+
# volatile-ttl : TTL 짧은 키부터 삭제 — 세션 저장소
# allkeys-random: 무작위 삭제
3. 메모리 사용량 모니터링
redis-cli INFO memory
# 주요 항목: used_memory_human, maxmemory_human, mem_fragmentation_ratio
redis-cli DBSIZE # 전체 키 개수
redis-cli MEMORY USAGE mykey # 특정 키 메모리 크기(bytes)
4. Spring Boot에서 Redis 메모리 효율화
@Bean
public RedisCacheConfiguration cacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30)) // TTL 필수 지정
.disableCachingNullValues() // null 캐싱 방지
.serializeValuesWith(
RedisSerializationContext.SerializationPair
.fromSerializer(new GenericJackson2JsonRedisSerializer())
);
}
정책 선택 가이드
| 사용 목적 | 권장 정책 | 이유 |
|---|---|---|
| 순수 캐시 (세션 없음) | allkeys-lru | 모든 키를 대상으로 LRU 교체, 가장 일반적 |
| 캐시 + 영구 데이터 혼합 | volatile-lru | TTL 있는 캐시 키만 삭제, 영구 키 보존 |
| 세션 저장소 | volatile-ttl | 만료 임박 세션 먼저 삭제 |
| 쓰기 보장 필수 | noeviction | 메모리 부족 시 에러 반환, 데이터 손실 없음 |
| 접근 빈도 편중 심함 | allkeys-lfu | 자주 쓰는 키 보존, Redis 4.0 이상 |
핵심 요약
maxmemory와maxmemory-policy는 항상 함께 설정한다.- 캐시 전용 서버라면 allkeys-lru가 기본 선택지다.
- Spring Boot에서는
entryTtl로 TTL을 반드시 지정해 키가 무한정 쌓이지 않게 한다. mem_fragmentation_ratio가 1.5 이상이면MEMORY PURGE또는 재시작을 고려한다.