[Redis] List 데이터 운영 - (Jedis)

2024. 4. 15. 14:51기술 창고/DataBase

728x90
SMALL

Redis의 List는 기본적으로 String 타입의 데이터들로 리스트화된 Linked List를 말합니다. (예 : ArrayList)

이를 통해 Queue와 Stack 형으로 운영되곤 합니다.

 

- Queue : 선입선출 형 자료구조로써, 가장 먼저 들어간 데이터가 가장 먼저 출력되는 자료구조

- Stack : 후입선출 형 자료구조로써, 가장 늦게 들어간 데이터가 가장 먼저 출력되는 자료구조

 

주요 명령어

- LPUSH

- RPUSH

- LPOP

- RPOP

- LLEN

- LTRIM

- LRANGE

- BLPOP

- BRPOP

 


Command 실습

RPUSH

rpush는 리스트의 오른쪽(마지막)에 데이터를 넣는 명령어입니다.

- 형식 : rpush {리스트 명} {데이터 값} 

 

 

 

RPOP

rpop은 리스트의 오른쪽(마지막)에 있는 데이터를 출력하는 명령어입니다.

- 형식 : rpop {리스트 명}

 

 

 

LPUSH

lpush는 리스트의 왼쪽(첫 번째)에 데이터를 넣는 명령어입니다.

- 형식 : lpush {리스트 명} {데이터 값}

 

 

 

LPOP

lpop은 리스트의 왼쪽(첫 번째)에 있는 데이터를 출력하는 명령어입니다.

- 형식 : lpop {리스트 명} {데이터 명}

 

 

 

# 이처럼 RPUSH, RPOP, LPUSH, LPOP 은 자료구조의 형태에 따라 적절히 사용합니다.

# Queue 리스트의 경우, RPUSH로 데이터를 넣었으면 LPOP을, LPUSH로 넣었으면 RPOP을 사용합니다.

# Stack 리스트의 경우, RPUSH로 데이터를 넣었으면 RPOR을, LPUSH로 넣었으면 LPOP을 사용합니다.

 

 

LRANGE

lrange는 리스트의 일정 크기 만큼 데이터를 조회하는 명령어입니다.

기본적으로 시작 인덱스는 0부터 시작하며 끝 인덱스의 경우에는 -1로 지정하게 되면 마지막 데이터까지 조회되게 됩니다.

- 형식 : lrange {리스트 명} {시작 인덱스} {끝 인덱스}

 

 

 

LTRIM

ltrim은 리스트의 일정 크기만큼 잘라 리스트를 재구성하는 명령어입니다.

- 형식 : ltrim {리스트 명} {시작 인덱스} {끝 인덱스}

 

 

 

BRPOP

brpop은 데이터가 존재하지 않을 경우에는 block 처리를 수행하여 pop 하지 못하도록 하고, 존재하면 그제서야 데이터를 Right Pop 해주는 명령어입니다.

- 형식 : brpop {리스트 명} {블락 대기 시간 (없어도 됨)}

 

(1) 모든 데이터 pop
(2) 다른 cmd에서 데이터 push
(3) 데이터가 존재하게 됬으므로 데이터 출력

 

 

BLPOP

blpop은 데이터가 존재하지 않을 경우에는 block 처리를 수행하여 pop 하지 못하도록 하고, 존재하면 그제서야 데이터를 Left Pop 해주는 명령어입니다.

- 형식 : blpop {리스트 명} {블락 대기 시간 (없어도 됨)}

 

 

(1) 모든 데이터 pop
(2) 다른 cmd에서 데이터 push
(3) 데이터가 존재하게 됬으므로 데이터 출력

 

 

LLEN

llen은 현재 리스트의 길이를 보여주는 명령어입니다.

- 형식 : llen {리스트 명}

 

 

 


Spring Boot 사전 연동 필요

https://jindevelopetravel0919.tistory.com/395

 

[Redis] Spring Boot 와 Redis 연동 설정 - (Jedis)

Spring Boot 환경에서 Redis 를 사용하기 위한 방법 중 하나인 Jedis 설정 과정과 연동 과정에 대해 정리해보겠습니다. 또한 제가 진행하고자 하는 Spring Boot는 gradle 환경입니다. (1) Dependency 추가 Build.gra

jindevelopetravel0919.tistory.com

 

 

Spring Boot 활용 실습

// Redis - List
public void jedisOfList() {
    try (JedisPool pool = jedisPoolSetting()) {
        try (Jedis jedis = pool.getResource()) {
            // [ list ]
            
            // 1. stack
            // [ RPUSH, LPUSH ]
            // rpush, lpush로 데이터를 List에 저장
            jedis.rpush("stack1", "aaa");
            jedis.rpush("stack1", "bbb");
            jedis.rpush("stack1", "ccc");

            // [ LRANGE ]
            // List의 특정 길이만큼의 데이터를 추출
            List<String> stack1 = jedis.lrange("stack1", 0, -1);
            stack1.forEach(System.out::println);

            // stack의 경우, 후입선출 로직으로서 가장 나중에 들어간 데이터가 가장 먼저 추출되므로 push와 동일한 방향으로 pop을 수행
            // [ LPOP, RPOP ]
            // lpop, rpop 데이터 추출
            System.out.println(jedis.rpop("stack1"));
            System.out.println();
            System.out.println("==================================");

            // 2. queue
            // [ RPUSH, LPUSH ]
            // rpush, lpush로 데이터를 List에 저장
            jedis.rpush("queue1", "zzz");
            jedis.rpush("queue1", "xxx");
            jedis.rpush("queue1", "sss");

            // [ LRANGE ]
            // List의 특정 길이만큼의 데이터를 추출
            List<String> queue1 = jedis.lrange("queue1", 0, -1);
            queue1.forEach(System.out::println);

            // queue의 경우, 선입선출 로직으로서 가장 먼저 들어간 데이터가 가장 먼저 추출되므로 push의 반대 방향으로 pop을 수행
            // [ LPOP, RPOP ]
            // lpop, rpop 데이터 추출
            System.out.println(jedis.lpop("queue1"));
            System.out.println();
            System.out.println("==================================");

            // [ BLPOP, BRPOP ]
            while (true) {
                // 시간 제한을 두고 List에서 데이터를 pop으로 추출 하는 blpop, brpop
                List<String> blpop = jedis.blpop(10, "queue:blocking");
                if (blpop != null) {
                    blpop.forEach(System.out::println);
                }
            }

        }
    }
}

 

결과 1

 

blpop의 경우 어플리케이션이 실행되는 도중에 cmd에서 push 하여 넣었을 경우 자동으로 출력되는 결과 2

 

728x90
반응형
LIST