DB/Redis

Redis 문자열 실습: 기본 데이터 타입 다루기

hyeseong-dev 2024. 9. 11. 10:36
~ docker exec -it 06f8c72dd4cc redis-cli
127.0.0.1:6379> RPUSH stack1 100
(integer) 1
127.0.0.1:6379> RPUSH stack1 100
(integer) 2
127.0.0.1:6379> RPUSH stack1 100
(integer) 3
127.0.0.1:6379> RPUSH stack1 200
(integer) 4
127.0.0.1:6379> RPOP stack1
"200"
127.0.0.1:6379> RPOP stack1
"100"
127.0.0.1:6379> RPOP stack1
"100"
127.0.0.1:6379> RPOP stack1
"100"
127.0.0.1:6379> RPOP stack1
(nil)
127.0.0.1:6379> RPUSH queue1 100
(integer) 6
127.0.0.1:6379> RPUSH queue1 200
(integer) 7
127.0.0.1:6379> RPUSH queue1 300
(integer) 8
127.0.0.1:6379> RPUSH queue1 400
(integer) 9
127.0.0.1:6379> LRANGE queue1 0 -1
1) "100"
2) "200"
3) "300"
4) "400"
127.0.0.1:6379> LPOP queue1
"100"
127.0.0.1:6379> LPOP queue1
"200"
127.0.0.1:6379> LPOP queue1
"300"
127.0.0.1:6379> LPOP queue1
"400"
127.0.0.1:6379> LPOP queue1
(nil)
127.0.0.1:6379> RPUSH queue1 100
(integer) 1
127.0.0.1:6379> RPUSH queue1 100
(integer) 2
127.0.0.1:6379> RPUSH queue1 200
(integer) 3
127.0.0.1:6379> RPUSH queue1 200
(integer) 4
127.0.0.1:6379> RPUSH queue1 300
(integer) 5
127.0.0.1:6379> LRANGE queue1 0 -1
1) "100"
2) "100"
3) "200"
4) "200"
5) "300"
127.0.0.1:6379> LRANGE queue1 0 -1
127.0.0.1:6379> LTRIM queue1 0 2
OK
127.0.0.1:6379> LRANGE queue1 0 -1
1) "100"
2) "100"
3) "200"
127.0.0.1:6379> RPUSH queue1 400
(integer) 4
127.0.0.1:6379> RPUSH queue1 50
(integer) 5
127.0.0.1:6379> RPUSH queue1 60
(integer) 6
127.0.0.1:6379> RPUSH queue1 70
(integer) 7
127.0.0.1:6379> LRANGE queue1 0 -1
1) "100"
2) "100"
3) "200"
4) "400"
5) "50"
6) "60"
7) "70"
127.0.0.1:6379> LTRIM queue1 0 2
OK
127.0.0.1:6379> LRANGE queue1 0 -1
1) "100"
2) "100"
3) "200"

위 Redis 명령어 세션에서 수행된 작업에 대한 설명은 다음과 같습니다.

1. RPUSHRPOP을 이용한 stack1 리스트 조작:

127.0.0.1:6379> RPUSH stack1 100
127.0.0.1:6379> RPUSH stack1 100
127.0.0.1:6379> RPUSH stack1 100
127.0.0.1:6379> RPUSH stack1 200
  • RPUSH 명령어는 리스트의 오른쪽(끝)에 요소를 추가합니다.
  • 위 명령어는 stack1 리스트에 차례로 100, 100, 100, 200을 추가합니다.
127.0.0.1:6379> RPOP stack1
  • RPOP 명령어는 리스트의 마지막 요소를 제거하고 반환합니다.
  • 위 명령어에서는 stack1 리스트의 끝에서부터 요소를 하나씩 꺼냅니다. 리스트의 순서대로 "200", "100", "100", "100"을 꺼내고, 마지막에 리스트가 비면 nil을 반환합니다.

2. RPUSH, LRANGE, LPOP을 이용한 queue1 리스트 조작:

127.0.0.1:6379> RPUSH queue1 100
127.0.0.1:6379> RPUSH queue1 200
127.0.0.1:6379> RPUSH queue1 300
127.0.0.1:6379> RPUSH queue1 400
  • queue1 리스트에 차례대로 100, 200, 300, 400을 추가합니다.
127.0.0.1:6379> LRANGE queue1 0 -1
  • LRANGE queue1 0 -1queue1 리스트의 모든 요소를 반환합니다. 여기서 0은 첫 번째 요소, -1은 마지막 요소를 의미합니다.
  • 이 명령어는 리스트에 있는 100, 200, 300, 400을 반환합니다.
127.0.0.1:6379> LPOP queue1
  • LPOP 명령어는 리스트의 첫 번째 요소를 제거하고 반환합니다.
  • queue1 리스트에서 차례로 "100", "200", "300", "400"을 제거한 후, 리스트가 비면 nil을 반환합니다.

3. 새로운 요소 추가 및 LTRIM을 이용한 리스트 자르기:

127.0.0.1:6379> RPUSH queue1 100
127.0.0.1:6379> RPUSH queue1 100
127.0.0.1:6379> RPUSH queue1 200
127.0.0.1:6379> RPUSH queue1 200
127.0.0.1:6379> RPUSH queue1 300
  • queue1 리스트에 다시 100, 100, 200, 200, 300을 차례로 추가합니다.
127.0.0.1:6379> LRANGE queue1 0 -1
  • queue1 리스트의 모든 요소를 반환하며, 그 결과 100, 100, 200, 200, 300이 포함됩니다.
127.0.0.1:6379> LTRIM queue1 0 2
  • LTRIM queue1 0 2 명령어는 리스트를 0번 인덱스부터 2번 인덱스까지 자릅니다. 즉, 첫 번째 세 요소만 남기고 나머지는 모두 제거됩니다.
  • 리스트는 이제 100, 100, 200만 남게 됩니다.

4. 다시 리스트에 요소 추가 및 LTRIM으로 자르기:

127.0.0.1:6379> RPUSH queue1 400
127.0.0.1:6379> RPUSH queue1 50
127.0.0.1:6379> RPUSH queue1 60
127.0.0.1:6379> RPUSH queue1 70
  • queue1 리스트에 다시 400, 50, 60, 70을 추가합니다.
127.0.0.1:6379> LRANGE queue1 0 -1
  • queue1 리스트의 모든 요소를 반환하며, 그 결과는 100, 100, 200, 400, 50, 60, 70입니다.
127.0.0.1:6379> LTRIM queue1 0 2
  • 리스트를 다시 0번 인덱스부터 2번 인덱스까지 자릅니다. 이제 리스트에는 100, 100, 200만 남습니다.

27.0.0.1:6379> LRANGE queue1 0 -1
(empty array)
127.0.0.1:6379> LPUSH queue1 200
(integer) 1
127.0.0.1:6379> LPUSH queue1 100
(integer) 2
127.0.0.1:6379> LPUSH queue1 100
(integer) 3
127.0.0.1:6379> LPUSH queue1 50
(integer) 4
127.0.0.1:6379> LPUSH queue1 60
(integer) 5
127.0.0.1:6379> LPUSH queue1 70
(integer) 6
127.0.0.1:6379> LRANGE queue1 0 -1
1) "70"
2) "60"
3) "50"
4) "100"
5) "100"
6) "200"
127.0.0.1:6379> LTRM queue1 0 2
(error) ERR unknown command 'LTRM', with args beginning with: 'queue1' '0' '2'
127.0.0.1:6379> LTRIM queue1 0 2
OK
127.0.0.1:6379> LRANGE queue1 0 -1
1) "70"
2) "60"
3) "50"

5. BLPOP:

BRPOP는 Redis에서 blocking list pop 명령어입니다. 이 명령어는 하나 이상의 리스트의 끝에서 (오른쪽에서) 요소를 제거하고 반환하는 작업을 수행하지만, 해당 리스트가 비어있을 경우에는 지정된 시간 동안 대기합니다. 만약 시간 내에 요소가 추가되지 않으면 nil을 반환합니다.

BRPOP의 사용법은 다음과 같습니다:

BRPOP key [key ...] timeout

매개변수 설명:

  • key [key ...]: 리스트의 이름입니다. 하나 이상의 리스트를 지정할 수 있습니다. 여러 리스트를 지정하면, Redis는 지정된 리스트들 중에서 요소가 있는 리스트를 차례대로 확인합니다.
  • timeout: 리스트가 비어있을 경우 얼마나 대기할 것인지를 초(second) 단위로 지정합니다. 0을 지정하면 무한정 대기합니다.

예시:

1. 리스트가 비어있지 않은 경우:

   RPUSH mylist "one"
   RPUSH mylist "two"

   BRPOP mylist 0
   # 응답: 1) "mylist", 2) "two"

이 경우, mylist에서 마지막 요소인 "two"가 제거되고 반환됩니다.

2. 리스트가 비어있는 경우:

   BRPOP mylist 5

이 경우, mylist가 비어 있으면 5초 동안 요소가 추가되기를 기다립니다. 시간이 지나도 요소가 추가되지 않으면 nil을 반환합니다.

3. 여러 리스트에서 블록킹 처리:

   BRPOP list1 list2 10

이 명령어는 list1list2에서 마지막 요소를 확인합니다. 만약 list1이 비어있으면 list2를 확인합니다. 둘 다 비어있으면 10초 동안 대기합니다.

특징:

  • 블록킹: 리스트가 비어있을 때 다른 요소가 추가될 때까지 대기할 수 있다는 점에서 BRPOPRPOP과 다릅니다.
  • 타임아웃: 시간 초과를 설정하여 특정 시간 동안만 대기할 수 있습니다. 0을 설정하면 무기한 대기합니다.

이 명령어는 주로 consumer가 데이터를 처리할 준비가 될 때까지 대기해야 하는 producer-consumer 패턴에서 유용하게 사용됩니다.