운영 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 → 점진적·안전한 대체 명령
'TIL' 카테고리의 다른 글
| 서버 CPU 픽 떠서 서버 에러율 높았던 사건 회고록 (0) | 2025.11.17 |
|---|---|
| Redis 한쪽노드에 메모리 몰린 경우 (0) | 2025.11.03 |
| Node Exporter 네트워크 수집 문제 (0) | 2025.10.29 |
| 닷넷 프레임워크 DLL 체험기 (0) | 2025.10.28 |
| DB CPU 스파이크 원인 추적기 (0) | 2025.10.27 |