교육 : Redis 란?

호밀빵 굽는 쿼카·2022년 1월 12일
0

NHN Cloud 인턴

목록 보기
6/48

❗️ 교육받은 내용을 실시간으로 바로 정리한 것이어서 정확하지 않을 수 있습니다!❗️

Redis 란?

Mysql : 관계형(조인,인덱스 등)
Redis : 간단하게 저장가능

  • 데이터를 key-value 형식으로 저장하는 NoSQL
  • NoSQL 중의 하나
    1) 단순한 대량의 데이터를 저장
    2) 고정되지 않은 스키마
  • 캐시(자주 사용되는 데이터 빨리 가져오기 위해)로 사용
  • 빠르게 접근가능
  • 다양한 자료구조
  • 모든 데이터를 디스크가 아닌 메모리에 저장=>껐다키면 사라짐

형식
Web->Redis->MySQL

다양한 자료구조 유용한 이유

  • 개발의 편의성

자료구조 종류

String

문자열 저장, 모든 이진데이터 저장

> set hello world
ok
> get hello
"world"
HTML, JPEG 통째로 key에 넣을 수 있음
  • INCR/INCRBY -> 조회수같은 거 빠르게 보여줄 수 있음(가져오고 하지 않고)
  • GETSET -> 옛날 키를 반환
  • OPTION : XX/NX
    1) XX
    2) NX

List

일반적인 linked-list, Queue로 사용

Hash

String-String 쌍을 가짐, 객체를 저장하기 좋은 데이터 유형

Why Hash??

HMSET user:1000 name garim password pw123 age 26 hobby running

Set

다양한 집합 연산 빠르게 수행, 중복 허용하지 않음

  • 특정 게시물을 방문하는 고유한 IP 주소
  • 게시물의 태그 기능
> sadd project:1000:tags important python documentation
  • 임의로 아이템 추출

Sorted Set

중복값을 허용하지 않고, 모든 값이 score과 연결, 저장될때부터 정렬돼서 저장(정렬기준-score,데이터순,,등등)

  • ZRANGE/ZREVRANGE

key

  • 문자열타입
  • 가독성 좋고 스키마를 유지하도록 키 설계
  • 캐시 사용 시 timeout 설정 권장


Redis 야무지게 사용하기👍

CACHING(캐싱)

  • 데이터의 원래 소스보다 빠르게 액세스할 수 있는 임시 데이터 저장소
  • 데이터가 변하지 않을수록 캐시 사용하는게 효율적
  • 빠른 성능

캐싱 전략

어떻게 배치하는지가 성능에 영향을 줌

  • 읽기전략 : 어플에서 redis에 데이터 있는지 물어보고 없으면(cass miss) db 갔다가 데이터 가져오고 다시 redis에 넣기
    => redis 신규구축하면 redis 에 데이터 넣는 작업을 할수도 있음
    => redis<->db 왔다갔다 과정이 많으면 장애는 생기지 않지만 운영이 느려질 수 있음
  • 쓰기전략
    1) write-around : 데이터를 db에만쓰는거
    -> redis 데이터가 최신데이터라고 보장할수없음
    2) write-through : 데이터를 db+redis에쓰는거
    -> 효율적이지 않음

어떤상황일때 Redis를 쓰나요?

  • 관계형db에서 최근검색목록가져오려면?
  • redis의 sorted set 사용해서
  • score 타임스탬프와 검색한 내용을 같이 저장=>몇시에 무슨검색을 했는지 저장됨
  • 중복되지않고 저장가능
  • 검색할때마다 레디스에 데이터저장
  • 만약 최대 다섯명까지만 저장하려면?
    =>항상 인덱스 -6를 삭제한다면 오버헤드 감소!
    =>ZREMERANGEBYRANK

Event QUEUE

큐를 사용하는 이유 : a데이터베이스에서 개발을 하다가 로그가 쌓이면 b데이터베이스에 던져줌(효율적저장)

  • my-q 에 대해서 찾아보기
  • 들어올때까지 기다리고 설정 초안에 데이터 들어오면 정보보내줌
  • 예시 ) 트위터 타임라인
    -> 타임라인이라는 키가 있을때만 데이터를 붙여줌
    -> 타임라인이라는 키가 없으면 데이터를 붙여주지 않음
    -> RPUSHX를 이용해 '이미 캐싱되어있는 피드'에만 추가

일일 순 방문자수 구하기

  • string key로 구하기 : 인원이 많아지면 비효율적
  • bit 연산으로 구하기 : 사용자가 천만명이라도 천만개의 bit는 1.2MB 밖에 안됨. BITCOUNT통해 구할 수 있음
  • 출석 이벤트로 구하기 : BITOP통해 구함
    BITOP AND event_result unique:visitors:20200129 unique:visitors:20200130,,,

좋아요 처리하기

  • 좋아요 갯수자체가 엄청 중요하진 않음=>오히려 정확히 하려면 인원이 많아져서 부하가 생기면 장애생김
  • Redis Set 사용
    => 중복없이 빠르게 처리 가능

timeout

  • redis 캐시로 사용할때 expire time(timeout) 쓰는거 권장
  • 메모리가 꽉차는 상황이 생기면 그때 삭제할 수 있는 전략이 많음
    => redis.conf에 MAXMEMORY-POLICY를 사용
    => 기본 : noeviction->꽉찼을때 삭제를안함(왜냐하면 redis 삭제 맘대로 하면 안되기 때문)->but 캐시로 썼을때 휘발돼도 됨->사용하지 않음
    => alkeys-lru : 키를 넣어줄때 데이터가 넘치면 'expire time이 있는 데이터+expire time설정'은 삭제한다'를 추가

    LRU(least recently used)
    가장 최근에 사용되지 않은 것. 페이지에 저장되 데이터가 언제 사용됐는지 판단해 오랫동안 참조되지 않은 데이터 제거

세션 캐시 차이

세션 : 없어지면 안됨 (로그인정보같은 것) -> 사용자가 웹 사용할 때 세션서버가 죽게되면 정보가 다 사라짐, 따라서 세션 용도로 사용할때에는 적절한 HA나 백업기능을 사용하는 걸 권장. 만약 Stand Alone으로 마스터 한대만 띄워져있을 때에 장애로 인해 서버가 죽게되면, 그 세션 데이터는 어디에도 남아있지 않게 되기 때문!
캐시 : 휘발되는 성격 -> 이전에 사용되었던 데이터 다시 사용되는 형식이라서 빠르게 접근 가능한 저장소에 저장 (예시>홈페이지 재접속 시 css/js 파일을 사용자의 PC에서 로드, 서버를 거치지 않아도 됨)

NoSQL 단점

메모리에만 올라가 있기 때문 휘발된다는 단점

NoSQL RDBMS 차이

  • NoSQL : 테이블 간 관계를 정의하지 않음. scale-out을 목표로 등장
  • RDBMS : 테이블 간 관게를 정의하는 관계형 DBMS. 모든 데이터를 2차원 테이블형태로 표현. 외래키,join 등 가능

Redis 데이터 백업

1. In-memory

  • 복제를 사용=>데이터 유실을 막을 수는 없음
  • 마스터의 명령이 리플리카에 그대로 저장되기 때문

2. 방법

  • AOF : 사용자의 데이터를 모두 저장해서 모든 흔적이 남아있음
  • RDB : 스냅샷 방식으로 데이터 저장할때의 상태를 찍듯이 저장(한정적 정보만 저장)
  • 상황에 따라 위 두개의 파일을 골라 사용
  • 가장 강력한 내구성은 위 두개 파일 동시 사용
  • 복원하는 방법 : 위 두개의 파일중 어떤 파일이 있는지 보고 복원
  • 하지만 위 두개 파일 권장하지 않는 이유가 있음
    =>copy-on-write : 저장을 위해 fork를 떠서 저장 프로세스를 따로 생성.(AOF,RDB파일을 쓰면) 그러면 복제된 메모리로 두개의 공간이 생기게 되면 메모리가 오버가돼서 서버가 죽을 수 있음

HA(고가용성)

Replication

  • 마스터와 리플리카
  • 구성 : replicaof 명령어 통해 단순한 복제 연결

Sentinel

  • 모니터링을 하는 프로세스
  • 마스터와 리플리카를 계속 보고 있을 수 있음->마스터가 문제가 생기면 sentinel이 보고 있다가 둘을 바꿔주고 해결 가능
  • 구성 : 최소 서버 3대 필요, sentinel 끼리 투표를 통해 마스터가 문제가 생겼는지를 판단. 과반수결정에 따르므로 홀수여야 함

Cluster

  • db 성능이 확장해야하면 2가지 방법이 존재
    => scale up vs scale out(샤딩)
    => scale out : 분산처리해주는 것 -> 처리를 나눠서 하기 위해 사용

scale out

  • 접속된 서버의 대수를 늘려 처리 능력을 향상
  • 서버 가상화 기능을 사용하고 가상적으로 복수 서버 구축해 스케일 아웃 등의 효과
    scale up
  • 서버 그 자체를 증강하는 것에 의해서 처리 능력을 향상

    샤딩
  • 샤딩을 구성하게되면 샤드의 수만큼 노드가 존재하며, 서버가 여러대 존재하므로 부하를 적절히 분산할 수 있는 장점
  • 클러스터 모드를 켜서 scale out 지정해주면 기능 사용가능

🌟 Redis=single thread 🌟

  • 엄청난 양의 작업을 실행하면 (예시: keys * ) cli 가 작업을 못하고 기다려야 함->쓰는것 지양
  • hash안에 여러 데이터 저장될 수 있음 -> 만약 hash안에 200만개 키저장돼있음 -> hash를 지우게 되면 -> 200만개 데이터 지워짐 -> 시간이 오래 걸리기 때문에 장애로 이어짐


참고링크

profile
열심히 굽고 있어요🍞

0개의 댓글