Redis key가 랜덤하게 사라지는 것처럼 보일 때 원인은 생각보다 자주 corruption이 아니라 eviction입니다. 다만 애플리케이션 입장에서는 eviction, expiration, overwrite, delete, write failure가 비슷하게 보이기 때문에 원인을 잘못 짚기 쉽습니다.
핵심은 간단합니다. 먼저 Redis가 실제로 maxmemory 압박 아래 있는지 확인하고, 어떤 eviction policy가 켜져 있는지 확인한 다음, 사라진 key가 eviction인지 expiration인지 애플리케이션 동작인지를 구분해야 합니다.
Redis에서 eviction이 뜻하는 것
Redis는 메모리 압박과 maxmemory 설정이 함께 있을 때만 eviction을 수행합니다.
즉 압박 상황에서 key가 사라진다면 이상 현상이라기보다 설정된 동작일 수 있습니다. 먼저 아래를 확인하세요.
maxmemory가 설정되어 있는가maxmemory-policy가 무엇인가- 지금 실제로 memory pressure가 있는가
마지막 질문의 답이 아니라면, 사라진 key는 expiration, overwrite, delete, 애플리케이션 로직으로 설명될 가능성이 더 큽니다.
정책에 따라 key가 사라지는 방식이 다른 이유
Redis는 아래 같은 policy를 제공합니다.
noevictionallkeys-lruallkeys-lfuallkeys-randomvolatile-lruvolatile-lfuvolatile-randomvolatile-ttl
핵심 차이는 Redis가 모든 key에서 evict할 수 있는지, TTL이 있는 key만 대상으로 삼는지입니다.
팀은 “cache key만 사라져야 한다”고 기대했는데 policy가 allkeys-*라면 Redis는 정상 동작 중이어도 incident는 이상하게 느껴질 수 있습니다.
eviction, expiration, overwrite는 서로 다릅니다
현장에서는 셋을 한 덩어리로 보는 경우가 많지만, 실제 점검 경로는 다릅니다.
- eviction: memory pressure와 policy 때문에 Redis가 key를 제거
- expiration: TTL이 0이 되어 key가 사라짐
- overwrite 또는 delete: 애플리케이션이 값을 바꾸거나 지움
key가 만료되어야 하는데 안 된다면 Redis Keys Not Expiring가 더 직접적인 다음 글입니다.
반대로 key가 사라지는 것이 아니라 write가 실패한다면 Redis OOM Command Not Allowed가 더 맞는 분기입니다.
실제 문제는 TTL 누락일 수도 있습니다
eviction 문제와 TTL 문제는 자주 같이 나타납니다.
대표적인 패턴은 이렇습니다.
- 앱은 cache key가 만료될 것이라고 기대한다
- 일부 key가 overwrite 과정에서 TTL을 잃는다
- memory가 오른다
- eviction이 시작되면서 예상과 다른 key가 사라진다
이 경우 policy는 이야기의 끝부분이고, 더 이른 원인은 TTL 동작입니다.
흔한 policy 오해
1. volatile-*가 모든 key에 적용된다고 생각하는 경우
아닙니다. TTL이 있는 key만 후보가 됩니다.
2. noeviction이면 아무 문제도 없다고 생각하는 경우
아닙니다. eviction을 안 하는 대신 추가 memory가 필요한 write가 실패할 수 있습니다.
3. 사라진 key는 무조건 eviction 때문이라고 생각하는 경우
애플리케이션 overwrite, delete, expiration 때문일 수도 있습니다.
4. workload shape가 결과를 바꾼다는 점을 놓치는 경우
같은 policy라도 burst write, 큰 value, 엉성한 TTL 운영 아래에서는 체감이 크게 달라집니다.
실전 점검 순서
- 현재 memory 사용량을 확인한다
maxmemory를 확인한다maxmemory-policy를 확인한다- 사라진 key에 TTL이 있었는지 확인한다
- write failure가 같이 있었는지 본다
- 현재 policy가 데이터 중요도 모델과 맞는지 판단한다
incident 중에는 policy를 곧바로 바꾸기보다 이 순서가 훨씬 안전합니다.
바로 확인할 명령
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
redis-cli INFO memory
redis-cli INFO stats
이 명령으로 Redis가 eviction 가능한 상태인지, memory pressure가 실제인지, incident 동안 evicted_keys 카운터가 오르는지 확인할 수 있습니다.
빠르게 분기하는 법
key가 사라질 때 아래처럼 먼저 갈라보면 좋습니다.
- memory pressure가 높고
evicted_keys가 오른다: eviction 먼저 의심 - TTL이 정상적으로 줄어든다: expiration 먼저 의심
- memory pressure가 낮고 TTL도 없다: overwrite나 delete 먼저 의심
- write가 OOM으로 실패한다:
noeviction또는 메모리 고갈 먼저 의심
이 분기만으로도 첫 30분 동안 엉뚱한 subsystem을 탓하는 일을 많이 줄일 수 있습니다.
증상별 진입 힌트
- memory pressure 아래서 key가 예상보다 빨리 사라지면 여기서 시작하면 됩니다.
- key가 아예 만료되지 않는 쪽이 더 의심되면 TTL 가이드가 더 직접적입니다.
- key가 사라지는 것이 아니라 OOM write failure가 보이면 OOM 가이드가 더 맞습니다.
FAQ
Q. 왜 일부 key만 사라지나요?
활성 policy가 TTL이 있는 key만 대상으로 삼거나, LRU/LFU 같은 접근 패턴 기준을 사용하기 때문입니다.
Q. noeviction이면 write도 안전한가요?
아닙니다. eviction은 막지만 추가 memory가 필요한 write는 실패할 수 있습니다.
Q. 가장 먼저 무엇을 봐야 하나요?
maxmemory, maxmemory-policy, 그리고 사라진 key에 TTL이 있었는지입니다.
Q. policy가 핵심이 아닐 때는 언제인가요?
memory pressure가 약하거나 없고, 실제 원인이 expiration이나 overwrite인 경우입니다.
Read Next
- 실제로는 만료 동작 문제라면 Redis Keys Not Expiring를 보세요.
- key가 사라지는 대신 write가 실패한다면 Redis OOM Command Not Allowed를 보세요.
- 메모리 압박 자체가 더 큰 문제라면 Redis Memory Usage High를 보세요.
Related Posts
Sources:
- https://redis.io/docs/latest/develop/reference/eviction/
- https://redis.io/docs/latest/commands/info/
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.