2024. 4. 15. 17:00ㆍ기술 창고/DataBase
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
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에 대한 내용은 이후에 좀 더 따로 정리해보도록 하겠습니다.
'기술 창고 > DataBase' 카테고리의 다른 글
[MySQL] 문자 구분 collation (3) | 2024.10.15 |
---|---|
[Redis] CentOS 환경 Redis 설치 (0) | 2024.04.16 |
[Redis] Sorted Set 데이터 운영 - (Jedis) (0) | 2024.04.15 |
[Redis] Hash 데이터 운영 - (Jedis) (0) | 2024.04.15 |
[Redis] Set 데이터 운영 - (Jedis) (0) | 2024.04.15 |