2024.05.07 - [Spring/대용량 트래픽] - Redis Transactions
이전 글은 Redis에서 트랜잭션에 대해 알아봤다.
명령어를 이야기 하기 전에 우선 Redis는 Single thread로 동작한다(순차 처리).
빠른 응답속도로 처리되는 in-memory의 장점이 사라진다. 그래서 장점을 살리기 위해서 대부분의 Redis 명령어는 시간복잡도 O(1)에 끝나지만 O(n) 의 시간복잡도를 가진 명령어의 경우 사용하는데 주의가 필요하다.
오늘 다루고자하는 Key와 Scan이 이에 해당한다.
KEYS 명령어
레디스에 저장된 KEY를 모두 조회한다. ( + 특정패턴으로도 조회 가능)
Value관점에서 유사 명령어 (O(n)시간복잡도를가진)
- LINSERT(List)
- HKEYS, HGETALL(Hash)
- SMEMBERS(Set)
이런 명령어들은 데이터가 100만, 1000만 . . . 이런식으로 늘어나게 된다면 서비스에 막대한 장애를 가져올 수있다.
이 역시 해결책이 있다!
Keys -> Scan 명령어로 대체하면 해결할 수 있다.
차이점은 특정 개수의 Key를 가져 올수 있다는 점이다. 또한 Cursor가 응답값에 포함되어있어서, 다음 명령때 Cursor를 포함시키고 가져올 개수를 입력하면 이어서 Key를 조회할 수 있다.
- 실습
docker exec -it [containerID] /bin/bash
우선 bash에서 실행시켰다.
0부터 9999999까지 for문을 돌면서 echo 명령어를 통해 key를 txt파일에 저장하는 문장을 실행했다.
이 데이터에 대해서 대용량 데이터 처리에 특화된 명령어를 쓸수있다.
이제부터는 redis-cli 명령어를 통해서 확인한다.
cat redis-string.txt | redis-cli --pipe
이 명령을 내리고 다른 터미널에서
docker exec -it [containerID] redis-cli --latency
이 명령어를 통해 명령어가 처리되는 값에 대해서 볼수있다.
redis-cli
KEYS *
SCAN 0 MATCH * COUNT 100
SCAN명령어를 KEYS대신 사용하여 엄청 빠른 조회가 가능하다.
커서값또한 리턴한다. 다음 값들을 조회하고 싶으면 위에 넣었던 0대신 커서값을 넣어주면 된다.
** 참고 : 정확히 내가 설정한 개수를 조회하는 것이 아니라, 내부적으로 상황에 맞게 조회하는 개수가 조금씩 달라질 수도있다.
O(n) 시간복잡도를 가지는 명령어들을 살펴봤다.
데이터 개수가 정말 많아진다면 성능에 심각한 영향을 미칠 수 있기때문에, 되도록이면 SCAN 명령어를 활용해서 전체데이터를 탐색하는 것보단 꼭 필요한 데이터만 탐색하도록 하자!
2024.05.07 - [Spring/대용량 트래픽] - Redis Cache 이론
'Spring > 대용량 트래픽' 카테고리의 다른 글
Redis Cache로 실습하기 (0) | 2024.05.08 |
---|---|
Redis Cache 이론 (0) | 2024.05.07 |
Redis Transactions (0) | 2024.05.07 |
Java에서 Redis 명령어 (0) | 2024.05.03 |
Redis 다양한 데이터 타입 알아보기 (0) | 2024.04.30 |