TIL

Redis keys vs Scan 차이

하얀잔디 2025. 11. 2. 16:50

운영 Redis에서 KEYS 썼다가 서버 멈추는 경우 많음
결과는 SCAN이랑 비슷해 보여도 성능 차이는 극명함

 


 

🔹 1. KEYS — 전체 탐색 (Blocking 방식)

 
redis-cli KEYS "pattern"
  • 모든 키 한 번에 전부 스캔함
  • Blocking 방식이라 Redis가 키 전부 메모리에 올릴 때까지 대기함
  • 키 수 많으면 서버 응답 멈춘 듯 보임
  • CPU, 메모리 급상승
  • Redis는 단일 스레드 → 그동안 다른 명령 대기
  • 수십만 개 이상이면 진짜 위험함

👉 개발/테스트에서는 OK, 운영에서는 절대 금지

 


 

🔹 2. SCAN — 점진적 비차단 스캔 (Cursor 기반)

 
redis-cli --scan --pattern "pattern"
  • Cursor 기반 반복 탐색
  • 한 번에 일부 키만 반환, 나머지는 다음 호출 때 이어감
  • Non-blocking → 다른 명령과 병렬 실행 가능
  • Redis 2.8 이상 지원
  • 모든 키 가져오려면 반복문 돌려야 하지만 안전함

👉 운영 환경에서도 안전하게 사용 가능


👉 대용량 스캔, 모니터링, 통계용으로 적합


 

🔸 비교 요약

항목KEYSSCAN
실행 방식 Blocking Non-blocking
서버 부하 매우 높음 낮음
대용량 안전성 위험 (중단 가능) 안전
사용 용도 테스트 / 디버깅 운영 / 모니터링 / 통계
결과 정확도 즉시 전체 반복 호출 후 전체
Redis 버전 모든 버전 2.8 이상

 

🔹 3. SCAN 내부 동작 방식

  • SCAN은 커서(cursor)를 반환함
  • 다음 호출 시 그 커서를 넘겨줘야 이어서 탐색함
  • --scan 옵션은 이 과정을 자동으로 반복함
 
redis-cli -h localhost -p 26379 --scan --pattern 'EUMC:*'

내부적으로는 아래와 동일함

 
SCAN 0 MATCH EUMC:* COUNT 1000 SCAN <cursor> MATCH EUMC:* COUNT 1000 ...

※ COUNT는 “가져올 개수 힌트”일 뿐 정확한 수 아님


 

🔹 4. 실무 팁

  • 운영 중엔 절대 KEYS 쓰지 말고 SCAN으로 대체
  • 자동화나 통계 수집 시엔 아래 방식 추천
 
redis-cli --scan --pattern 'prefix:*' | while read k; do echo $k done
  • 특정 키 존재 확인만 필요하면 EXISTS key
  • 여러 개면 MGET이나 TTL로 일부만 확인

 

✅ 한 줄 요약

🔥 KEYS → Redis 멈춤 유발
🧊 SCAN → 점진적·안전한 대체 명령