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

2024. 4. 15. 17:00기술 창고/DataBase

728x90
SMALL

Redis의 Bitmap 타입의 데이터는 0 또는 1의 값으로 이루어진 비트열을 말합니다.

메모리를 적게 사용하여 대량의 데이터들을 저장하는 데에 유용하게 사용됩니다.

 

주요 명령어

- SETBIT

- GETBIT
- BITCOUNT

 

 


Command 실습

SETBIT

setbit는 bit 값을 설정해줄 수 있는 명령어입니다.

- 형식 : setbit {bit 데이터 명} {offset : request 구분 값} 1

 

offset은 integer 값을 넣어주어야 합니다.

예를 들어 특정 페이지에 접속하고자 하는 유저들의 고유 id 값을 넣어줄 수 있을 것입니다.

 

 

GETBIT

getbit는 특정 bit의 값을 확인할 수 있습니다.

bit값이 존재할 경우 1이 조회될 것이고, 없을 경우에는 0이나 null이 조회될 것입니다.

- 형식 : getbit {bit 데이터 명} {offset : request 구분 값}

 

 

 

BITCOUNT

bitcount는 bit 데이터에 존재하는 offset 데이터들의 수를 출력합니다.

- 형식 : bitcount {bit 데이터 명}

 

 

 


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 활용 실습

// Reids - Bitmap (메모리를 적게 사용하여 대량의 데이터 저장 가능)
public void jedisOfBitmap() {
    try (JedisPool pool = jedisPoolSetting()) {
        try (Jedis jedis = pool.getResource()) {
            // [ SETBIT ]
            // setbit를 통한 요청 비트 설정
            jedis.setbit("request-0403", 100, true);
            jedis.setbit("request-0403", 200, true);
            jedis.setbit("request-0403", 300, true);

            // [ GETBIT ]
            // getbit를 통한 특정 요청 비트 조회
            System.out.println(jedis.getbit("request-0403", 200));
            System.out.println(jedis.getbit("request-0403", 350));

            // [ BITCOUNT ]
            // bitcount를 통한 특정 요청 비트의 갯수
            System.out.println(jedis.bitcount("request-0403"));

            // bitmap VS set 비교
            // Pipeline을 통해 다수의 동작을 한번에 처리
            Pipeline pipeline = jedis.pipelined();
            // IntStream에서 특정 max 수까지 돌려주는 rangeClosed함수를 통해 100000건의 데이터를 각각 set과 bitmap에 저장
            IntStream.rangeClosed(0, 100000).forEach(each -> {
                pipeline.sadd("request-set-0403", String.valueOf(each), "1");
                pipeline.setbit("request-bit-0403", each, true);

                // 1000일 때 Pipeline 동기화를 통해 모든 요청 수행
                if(each == 1000){
                    pipeline.sync();
                }
            });
            pipeline.sync();

            // memoryUsage를 통해 특정 Redis 객체 데이터의 메모리 사용량을 조회
            System.out.println("set을 사용했을 때의 메모리 사용량 : " + jedis.memoryUsage("request-set-0403"));
            System.out.println("bitmap을 사용했을 때의 메모리 사용량 : " + jedis.memoryUsage("request-bit-0403"));

            // 비교
            if(jedis.memoryUsage("request-set-0403") > jedis.memoryUsage("request-bit-0403")){
                System.out.println("bitmap이 더욱 효율적");
            }else{
                System.out.println("set이 더욱 효율적");
            }

        }
    }
}

 

결과

 

추가적으로 PipeLine의 Async 동기화 기술을 사용하여 동시에 Set과 Bitmap에 동일한 작업을 수행했을 때 발생되는 메모리 사용량을 비교했을 때 Bitmap이 좀 더 많이 메모리를 효율적으로 사용하는 것을 확인할 수 있었습니다.

 

PipeLine에 대한 내용은 이후에 좀 더 따로 정리해보도록 하겠습니다.

728x90
반응형
LIST