Redis에서 KEYS
와 SCAN
명령어: 차이점과 사용법
Redis는 빠르고 효율적인 인메모리 데이터 저장소로, 다양한 명령어를 제공하여 데이터를 관리하고 조회할 수 있습니다. 그중에서 KEYS
와 SCAN
명령어는 Redis 데이터베이스에서 키 목록을 검색할 때 사용하는 두 가지 주요 명령어입니다. 이 글에서는 각 명령어의 특징과 차이점, 그리고 실제로 어떤 상황에서 사용하면 좋은지에 대해 설명하겠습니다.
1. Redis의 단일 스레드 처리 방식
Redis는 단일 스레드 기반으로 동작합니다. 이는 모든 명령이 하나씩 순차적으로 실행되며, 특정 명령어가 많은 리소스를 소비할 경우 다른 작업에 영향을 줄 수 있음을 의미합니다. 이러한 특성은 키 검색과 같은 명령어에서 중요하게 작용합니다.
2. KEYS
명령어: O(n) 시간 복잡도를 가진 명령어
KEYS
명령어는 Redis에서 패턴에 맞는 모든 키를 반환하는 명령어입니다. 예를 들어:
KEYS *
위 명령어는 Redis에 저장된 모든 키를 반환합니다. 특정 패턴을 지정할 수도 있습니다.
KEYS user:*
이 명령어는 "user:"
로 시작하는 모든 키를 반환합니다.
특징:
- O(n)의 시간 복잡도를 가집니다. 이는 Redis에 저장된 모든 키를 순회하여 해당 패턴과 일치하는 키를 찾기 때문에 데이터 양이 많을수록 성능에 영향을 미칠 수 있습니다.
- 모든 키를 즉시 반환하기 때문에 큰 데이터셋에서는 성능 문제가 발생할 수 있습니다.
- 주로 개발 또는 디버깅 용도로 사용됩니다.
3. SCAN
명령어: 효율적인 반복자 방식의 키 검색
SCAN
명령어는 커서 기반의 반복자 방식을 사용하여 대량의 키를 점진적으로 검색하는 명령어입니다. 이 방식은 서버 성능에 영향을 최소화하면서 점진적으로 결과를 얻을 수 있습니다.
SCAN 0 MATCH user:* COUNT 10
위 명령어는 "user:"
로 시작하는 키를 검색하며, 한 번에 최대 10개의 키를 반환합니다. 커서(cursor) 기반이기 때문에 각 호출 시점에 다음 검색을 위한 커서 위치를 반환하며, 이를 통해 대량의 데이터를 처리할 수 있습니다.
특징:
- O(1)의 시간 복잡도를 가집니다. 이는 한 번에 모든 키를 검색하는 것이 아니라, 지정된 범위 내에서 점진적으로 검색을 진행하기 때문입니다.
SCAN
은 서버에 부담을 주지 않으며, 큰 데이터셋에서도 안전하게 사용할 수 있습니다.- 일반적으로 운영 환경에서 주로 사용되며, 대량의 데이터를 처리하거나 검색할 때 적합합니다.
4. KEYS
vs SCAN
: 언제 무엇을 사용해야 할까?
특징 | KEYS | SCAN |
---|---|---|
시간 복잡도 | O(n) | O(1) |
검색 방식 | 모든 키를 한 번에 반환 | 커서 기반의 점진적 반환 |
성능 | 데이터 양이 많으면 성능에 영향 | 서버에 부담을 주지 않으며 안전하게 사용 가능 |
주 사용 용도 | 개발 및 디버깅 | 운영 환경에서 대량 데이터 처리 |
제한 사항 | 대규모 데이터셋에서 성능 문제 발생 가능 | 대량의 키 처리에 적합하며 안전하게 사용 가능 |
5. 데이터 타입별 명령어
Redis는 다양한 데이터 타입을 지원하며, 각 데이터 타입에 맞는 명령어들이 존재합니다. 아래는 몇 가지 주요 데이터 타입과 관련 명령어입니다:
- List:
LINSERT
,LRANGE
- Hash:
HKEYS
,HGETALL
- Set:
SMEMBERS
,SADD
- Sorted Set:
ZRANGE
,ZADD
6. 실습 예시
Redis에서 KEYS
와 SCAN
명령어를 활용하여 데이터를 검색하는 예시는 다음과 같습니다.
1) KEYS
명령어 사용 예시
127.0.0.1:6379> KEYS user:*
1) "user:1"
2) "user:2"
3) "user:3"
이 명령어는 user:
로 시작하는 모든 키를 반환합니다.
2) SCAN
명령어 사용 예시
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 2
1) "2"
2) 1) "user:1"
2) "user:2"
이 명령어는 한 번에 두 개의 키를 검색하고, 커서를 반환하여 다음 검색에서 이어서 처리할 수 있습니다.
7. 요약
KEYS
와 SCAN
명령어는 모두 Redis에서 키를 검색하는 데 유용한 도구이지만, 사용 목적에 따라 선택적으로 사용해야 합니다. 작은 데이터셋이나 개발 환경에서는 KEYS
가 편리할 수 있지만, 대규모 데이터셋을 처리하거나 운영 환경에서 성능을 고려한다면 SCAN
을 사용하는 것이 좋습니다.
Redis의 트랜잭션과 함께 사용될 경우에도 이 명령어들은 중요한 역할을 할 수 있으며, 특히 SCAN
은 대규모 데이터를 안전하게 처리하는 데 있어 중요한 도구입니다. Redis의 다양한 데이터 타입과 명령어를 이해하고, 적절한 상황에 맞는 명령어를 사용하는 것이 Redis를 효과적으로 활용하는 방법입니다.
간단한 실습
for i in {0000000...9999999}; do echo set key$i $i >> redis-strings.txt; done
> ls
dump.rdb redis-strings.txt
> cat redis-strings.txt | redis-cli --pipe
위 코드의 목적은 Redis에 대량의 데이터를 간단하게 삽입하기 위한 실습 데이터를 생성하는 것입니다. 구체적으로 이 코드는 7자리 숫자로 이루어진 키-값 쌍을 자동으로 생성하고, 이를 Redis 데이터베이스에 한꺼번에 로드하는 방식으로 동작합니다.
코드 설명
1. for 루프를 사용하여 키-값 쌍 생성
for i in {0000000...9999999}; do echo set key$i $i >> redis-strings.txt; done
for i in {0000000...9999999}
: 0000000부터 9999999까지의 숫자를 순차적으로 생성합니다. 즉, 총 10,000,000개의 값을 반복 처리합니다.echo set key$i $i >> redis-strings.txt
:- 이 명령어는
set key0000000 0000000
과 같은 형식으로 RedisSET
명령을 생성합니다. - 생성된 각 명령어는
redis-strings.txt
파일에 추가로 저장됩니다 (>>
는 기존 파일에 덧붙이는 의미). - 결과적으로,
redis-strings.txt
파일에는 10,000,000개의SET
명령어가 들어가게 됩니다.
예시:
set key0000000 0000000
set key0000001 0000001
set key0000002 0000002
...
set key9999999 9999999
2. 파일 생성 후 확인:
> ls
dump.rdb redis-strings.txt
ls
명령어로 현재 디렉토리의 파일을 확인합니다.- 이 시점에서
redis-strings.txt
파일이 생성된 것을 확인할 수 있습니다. 이 파일은 이전 단계에서 생성된 10,000,000개의 RedisSET
명령어를 포함하고 있습니다. dump.rdb
는 Redis의 기본 데이터 덤프 파일로, 현재 Redis 데이터베이스의 스냅샷이 저장된 파일입니다.
3. Redis 데이터베이스로 로드:
> cat redis-strings.txt | redis-cli --pipe
`cat redis-strings.txt`: `redis-strings.txt` 파일의 내용을 출력합니다.
`| redis-cli --pipe`: `redis-cli`를 통해 Redis 서버에 **파이프라인** 방식으로 데이터를 삽입합니다.
`--pipe` 옵션은 대량의 데이터를 효율적으로 삽입할 수 있도록 Redis 명령어들을 한꺼번에 전송하는 역할을 합니다.
파이프라인 방식은 Redis에서 다량의 명령어를 처리할 때 성능을 크게 향상시켜줍니다.
결과적으로, 이 명령어는 redis-strings.txt
파일에 저장된 10,000,000개의 SET
명령을 Redis 서버에 빠르게 삽입하는 과정입니다.
목적
이 코드는 간단한 실습 데이터를 대량으로 생성하고 이를 Redis에 적재하기 위한 목적으로 사용됩니다. 각 키는 key0000000
, key0000001
와 같은 형식으로 7자리의 숫자가 붙은 문자열이며, 해당 키의 값은 해당 키에 대응하는 숫자 값입니다. 이는 대규모 데이터를 Redis에 적재하는 실습을 통해 성능 테스트를 하거나, 다양한 Redis 명령어를 실습하기 위한 좋은 데이터셋입니다.
요약
- 키 생성: 7자리 숫자로 이루어진 10,000,000개의 키와 값 쌍을 자동으로 생성.
- 파일 생성:
redis-strings.txt
파일에 RedisSET
명령어를 저장. - 데이터 적재:
redis-cli --pipe
를 사용하여, 파일의 내용을 Redis 서버로 빠르게 삽입.
이 방법은 Redis에서 대규모 데이터 삽입을 테스트할 때 유용한 기법입니다.
redis-cli --latency
redis-cli --latency
명령어는 Redis 서버의 응답 시간(레이턴시, latency)을 측정하는 도구입니다. 이를 통해 Redis 서버가 명령어에 응답하는 데 걸리는 시간, 즉 클라이언트와 서버 간의 통신이 얼마나 빠르게 이루어지는지 확인할 수 있습니다. 이 도구는 Redis의 성능을 모니터링하거나 문제를 진단할 때 유용하게 사용할 수 있습니다.
사용법:
redis-cli --latency
이 명령을 실행하면, redis-cli
가 Redis 서버에 지속적으로 PING 명령을 전송하고, 응답 시간을 실시간으로 보여줍니다. 이를 통해 서버의 현재 응답 시간을 모니터링할 수 있습니다.
출력 예시:
min: 0, max: 1, avg: 0.15 (1099 samples)
min: 0, max: 1, avg: 0.12 (1200 samples)
min: 0, max: 2, avg: 0.16 (1300 samples)
설명:
- min: PING 요청 중 가장 낮은 응답 시간(밀리초 단위).
- max: PING 요청 중 가장 높은 응답 시간(밀리초 단위).
- avg: 평균 응답 시간(밀리초 단위).
- samples: 지금까지 측정된 PING 샘플 수.
추가 옵션:
--latency-history: 응답 시간의 변화를 시간에 따라 기록하고 모니터링합니다.
redis-cli --latency-history
이 옵션을 사용하면 시간이 지남에 따라 레이턴시가 어떻게 변화하는지 확인할 수 있습니다.
--latency-dist: 레이턴시 분포도를 표시합니다.
redis-cli --latency-dist
이 명령은 레이턴시가 분포하는 범위를 시각화하고 분석할 수 있게 해줍니다. Redis 서버의 성능을 보다 깊이 이해하려는 경우 유용합니다.
--latency
실습 예시:
$ redis-cli --latency
min: 0, max: 1, avg: 0.12 (100 samples)
min: 0, max: 1, avg: 0.10 (200 samples)
min: 0, max: 2, avg: 0.13 (300 samples)
min: 0, max: 1, avg: 0.11 (400 samples)
이 출력 결과에서는 Redis 서버의 평균 응답 시간이 매우 낮으며(0.12~0.13ms), 서버가 명령을 처리하는 속도가 매우 빠르다는 것을 알 수 있습니다.
요약:
redis-cli --latency
: Redis 서버의 응답 시간을 측정.- min: 최소 응답 시간.
- max: 최대 응답 시간.
- avg: 평균 응답 시간.
- samples: 측정된 샘플의 수.
이 명령어는 Redis 성능 모니터링과 서버 상태 분석에 유용하며, Redis의 성능 문제가 있을 때 문제의 원인을 파악하는 데 도움을 줍니다.
'DB > Redis' 카테고리의 다른 글
Redis Cache 실습(Aka. Jedis, Cache Aside) (0) | 2024.09.14 |
---|---|
Redis Cache 활용법: 성능 최적화를 위한 캐시 전략 (0) | 2024.09.12 |
Redis 트랜잭션: 안전한 데이터 변경 처리하기 (0) | 2024.09.11 |
Redis Bitmap 실습: 비트 단위 데이터 처리 (0) | 2024.09.11 |
Redis Geospatial 실습: 좌표 기반 데이터 처리 (0) | 2024.09.11 |