Redis

Redis에 대한 짧은 공부

리콜 2024. 11. 13. 01:35

사이드 프로젝트를 진행하는데 DB를 고름에 있어서 고민을 하게 되었다.

 

먼저 프로젝트는 공유된 그림판을 만들려고 한다.

그런데 이때 이미지를 불러오는 속도가 빨라야 한다.

따라서 팀원들이 인덱스 파싱과 인메모리 DB 중 고민해봐야겠다고 했고 내가 이를 맡아서 알아보기로 하였다.

둘의 장단점을 비교 하면 할 수록 우리 프로젝트에는 Redis를 사용하여, 즉 인메모리 방식을 사용하여야

한다고 밖에 안들었다. 

O(1)의 시간으로 가져올 수 있고 PUB/SUB을 이용한다면 사용자들에게 변경 사항 들을 뿌려 줄 수 있을 것도 같았다.

 

다만 지금 정리하면서 생각하니 PUB/SUB은 메시지 큐로 사용했을때라 Redis가 두개여야 할것 같다는 생각이 든다.

 

아무튼 Redis 에 대해 잠깐 알아보자면

주로 키-값 형태로 데이터를 저장하며, 다양한 데이터 구조를 지원하여 원하는 방식으로 저장 및 활용이 가능하다. 

지원하는 데이터 구조로 

  • String: 단순한 키-값 쌍
  • Hash: 필드와 값을 가지는 해시 테이블 (예: 사용자 프로필)
  • List: 연결 리스트 형태 (예: 작업 큐)
  • Set: 중복 없는 값의 집합 (예: 태그)
  • Sorted Set: 우선순위가 있는 집합 (예: 순위 목록)

가 있다.

 

MongoDB와 같이 NoSQL으로서 인메모리에 저장하여 빠르게 데이터를 가져 올 수 있다.

 

기본적으로 저장하는 방식은

set 키 값
get 키 값

이다.

 

나는 docker를 이용하면 최신 버전을 깔 수 있다고 하여 redis 최신 이미지를 run하여 실행 하였다.

 

그뒤 터미널에 들어가 명령어를 실행 하였는데 안되어서 뭔가 했는데

redis-cli

라는 명령어를 해야 명령어를 입력하는 단계가 된다.

 

우리가 사용하는 그림판을 저장하기 위해서

처음에는 

HSET global 100_100 "#FF5733"

 

이렇게 Hash를 이용하여 저장하려 하였다.

그런데 이렇게 저장하게 되면 나중에 처음 접속하여 전체 화면을 가져올때 너무 많이 힘들 것이라 생각하였다.

따라서 이방법을 보류해둔뒤 방법을 찾다가

Redis의 BITFIELD를 알게 되었다.

 

Redis의 Bitfield는 문자열(String) 데이터 타입을 비트 단위로 관리하여 매우 효율적으로 데이터를 저장하고 조작할 수 있도록 해주는 기능입니다. 특히, 메모리 공간을 절약하면서 다수의 작은 정수를 효율적으로 관리해야 할 때 유용합니다. 예를 들어, 사용자의 온라인 상태를 비트로 표현하거나, 플래그를 관리하는 등의 용도로 활용할 수 있습니다.

Bitfield의 특징

  • 메모리 효율성: 비트 단위로 데이터를 저장하여 불필요한 공간 낭비를 줄입니다.
  • 다양한 연산: 비트 설정, 조회, 증가/감소 등 다양한 연산을 지원합니다.
  • 유연성: 다양한 크기의 정수를 비트 단위로 관리할 수 있습니다.

Bitfield 사용 예시

1. 사용자 온라인 상태 관리:

  • 각 비트를 사용자의 온라인 상태(0: 오프라인, 1: 온라인)로 표현합니다.
  • 특정 사용자의 온라인 상태를 조회하거나 변경할 때 Bitfield 명령을 사용합니다.

2. 플래그 관리:

  • 각 비트를 특정 기능의 활성화 여부를 나타내는 플래그로 사용합니다.
  • 필요에 따라 플래그를 설정하거나 해제할 수 있습니다.

3. 통계 정보 저장:

  • 각 비트를 특정 이벤트 발생 횟수를 나타내는 카운터로 사용합니다.
  • Bitfield의 증가/감소 연산을 통해 카운터 값을 관리합니다.

Bitfield 명령어

  • SET: 특정 비트에 값을 설정합니다.
  • GET: 특정 비트의 값을 가져옵니다.
  • INCRBY: 특정 비트의 값을 증가시킵니다.
  • DECRBY: 특정 비트의 값을 감소시킵니다.

 

이 방식을 지원해주는 Spring Data 의 redis template를 사용하거나 TypeScript 를 사용하면 될것 이라 판단 하여 이를 사용해야겠다고 판단하게 되었다.

 

 

반응형