Spring/대용량 트래픽

Redis Key, Scan 명령어

Ls._.Rain 2024. 5. 7. 21:58

2024.05.07 - [Spring/대용량 트래픽] - Redis Transactions

 

Redis Transactions

2024.05.03 - [Spring/대용량 트래픽] - Java에서 Redis 명령어 Java에서 Redis 명령어2024.04.30 - [Spring/대용량 트래픽] - Redis 다양한 데이터 타입 알아보기 Redis 다양한 데이터 타입 알아보기2024.04.05 - [Spring/

lsdiary.tistory.com

 

이전 글은 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 *

대략 3초가 걸리도록 변경

SCAN 0 MATCH * COUNT 100

SCAN명령어를 KEYS대신 사용하여 엄청 빠른 조회가 가능하다.

1) 커서값

커서값또한 리턴한다. 다음 값들을 조회하고 싶으면 위에 넣었던 0대신 커서값을 넣어주면 된다.

** 참고 : 정확히 내가 설정한 개수를 조회하는 것이 아니라, 내부적으로 상황에 맞게 조회하는 개수가 조금씩 달라질 수도있다.


O(n) 시간복잡도를 가지는 명령어들을 살펴봤다.

데이터 개수가 정말 많아진다면 성능에 심각한 영향을 미칠 수 있기때문에, 되도록이면 SCAN 명령어를 활용해서 전체데이터를 탐색하는 것보단 꼭 필요한 데이터만 탐색하도록 하자!

2024.05.07 - [Spring/대용량 트래픽] - Redis Cache 이론

 

Redis Cache 이론

2024.05.07 - [Spring/대용량 트래픽] - Redis Key, Scan 명령어 Redis Key, Scan 명령어2024.05.07 - [Spring/대용량 트래픽] - Redis Transactions Redis Transactions2024.05.03 - [Spring/대용량 트래픽] - Java에서 Redis 명령어 Java

lsdiary.tistory.com