[TIL]DB : Redis

은경·2022년 2월 23일
0
post-thumbnail

1. Redis(Remote Dictionary Server) 란?


  • 비 관계형 데이터를 저장하고 관리 하기 위한 NoSQL의 일종.
  • 메모리 기반 데이터베이스 관리 시스템 (DBMS) -> 모든 데이터를 메모리로 불러와서 처리.
  • key-value 데이터 구조 스토어.
  • 속도가 빠르고 간편하여 성능이 중요한 웹, 게임, 스트리밍, 광고 기술 등 여러 방면으로 사용
  • 여러 대의 서버 구성이 가능하고 데이터베이스, 캐시 둘다 사용될 수 있는 기술

2. Redis의 장점


  1. 메모리에서 읽어들이는 것이 RDBMS에서 데이터를 꺼내 오는 것 보다 천배 가량 빠르다.
  2. 리스트, 배열 데이터를 처리하는 데 유용하며, Value 값으로 문자열, 리스트, Set, Sorted set, Hash 등 여러 데이터 형식을 지원한다.
  3. 리스트 형 데이터 입력 & 삭제가 MySQL에 비해 10배 정도 빠르다고 함.
  4. 메모리를 활용 하여 영속적인 데이터 보존, 삭제 또는 만료를 설정하지 않으면 데이터가 삭제되지 않으며 스냅샷 기능을 이용하여 메모리의 내용을 해당 시점으로 복구가 가능하다.

3. Redis의 단점


  1. 메모리를 2배로 사용.
  2. copy-on-write 방식을 사용, 잦은 데이터 변경 시 메모리 크기만큼 자식 프로세스가 복사하게 되므로 실제로 필요한 메모리양보다 더 많은 메모리를 사용하게 된다.
  3. 대규모 트래픽으로 많은 데이터 업데이트 시 불안정한 속도.

4. Redis의 사용


📌 레디스가 주로 사용되는 곳

웹 서버에서 key-value 형태의 데이터 타입을 처리해야하며, Input과 Output이 빈번히 발생해 다른 저장 방식을 선택시 효율이 떨어지는 경우 사용.

I/O가 빈번한 경우 ex) 조회수 카운트 (Youtube) 데이터를 캐싱 처리하고 일정한 주기에 따라 데이터베이스에 업데이트 한다면 부담이 적고 효율적이다.
또한 사용자 세션 관리(세션 유지, 불러오기 등)에도 유용하게 쓰인다.
이 외에도 채팅, 메시징 및 대기열, 스트리밍 , 실시간 분석 등에 많이 사용된다.

📌 레디스 사용시 주의할 점

인메모리 데이터 저장소로서 서버에 장애가 발생하는 경우 데이터가 유실된다.
따라서 스냅샷(Snapshot), AOF 기능을 통한 복구 계획을 미리 세워두는 것을 필요로 한다.

또한 캐시 솔루션으로 사용 시 잘못된 데이터가 캐싱 되는 것을 미리 방지 해야한다.


5. Redis의 구조


❗️ 레디스는 기존 관계형 데이터베이스와 달리 데이터 타입(varchar, int, datetime) 등을 지원하지 않음.

  1. String
    • 대부분의 데이터를 문자열로 표현 (숫자, 날짜 포함)
  2. Hash
    • 해시는 필드를 가질 수 있음 ex) 사용자 정보 해시 -> 이메일과 닉네임필드를 가질 수 있으며 해시는 전체를 가져오거나 개별 필드를 가져올 수 있음.
  3. List
    • 연결리스트(Linked list)이며 배열의 왼쪽, 오른쪽에 요소를 추가할 수 있으며 리스트안의 데이터는 문자열만 들어갈 수 있음.
  4. Set
    • 리스트와 유사하나 고유 값(Distinct value)을 저장 한다는 차이점을 가지며 셋은 정렬을 할 수 있다(Sorted Set) -> 특정 기준의 데이터 필터링 가능.
<redis의 스키마 예시>

# 유저의 이메일, 닉네임, 로그인 시간을 레디스에 저장시

user:userid:email:문자열
user:userid:nickname:문자열
user:userid:lastlogin:문자열

#레디스는 RDBMS와 달리 키가 많아도 O(1)의 동일한 시간이 적용됨

❗️ 주의 사항

레디스는 한 번 생성한 키를 선택적으로 삭제하기 어렵기 때문에 주의 해야한다.
특별한 조치를 하지 않으면 키는 영원히 보관되기 때문에 일괄삭제, 일정 시간 이후 삭제,기간 만료 후 삭제 방법 중 택해서 사용해야 한다.

참고 자료 (Reference)


https://brunch.co.kr/@skykamja24/575
http://wiki.hash.kr/index.php/%EB%A0%88%EB%94%94%EC%8A%A4
https://engkimbs.tistory.com/869
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gkenq&logNo=10184366374

profile
Back-end 개발자

0개의 댓글