ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • db) Redis
    DB/데이터베이스 2024. 1. 14. 01:29

     

    -정의
    ㄴ 일종의 데이터베이스 (Document Database)
    ㄴ 개발자에 따라서 DB라고 부르지않는 사람도 있음
    ㄴ Redis는 램을 사용하는 데이터베이스 (말그대로 캐싱을 위한 데이터베이스) 

     

    ㄴ그래서 램과같이 휘발성을 가지고, 속도가 매우빠르다 

     

     

     

     

    특징

    1. 램을 사용해서 무진장 빠름
    2. 램을 쓰기 때문에 갑자기 서버 전원이 꺼지면 모두 날아감(휘발성)

     ㄴ 데이터의 영속성을 보장하지 않음
    3. 다른 db처럼 CRUD기능을 제공함
    4. 이외에 Redis만의 독특한 자료구조
    5. Document Database이므로 JSON 사용

     

     

     

     

    -Collection 
    ㄴ Redis에 존재하는 자료구조
    (비유하자면 RDB의 테이블과 같은 위치)
    ㄴ 5개 종류가 존재하는데, 이 5개에 각각의 기능이 있음


    1. String : 일반적으로 세션과 동일한 형태
    (Key : Value)

     

     

     

    APPEND - 키가 이미 있고 문자열인 경우 문자열의 끝에 추가 , 키가 없으면 입력된 key value를 기준으로 생성

    SET - 문자열 value를 유지할수 있도록 key value설정 , 키가 이미 있다면 마지막에 Set한 값으로 덮어쓰고 라이브 시간은 마지막 Set작동시 폐기됨.

    GET - 해당 key값이 가지고 있는 value값을 가져온다 , 키가 없다면 특수 값 nil을 반환한다. 또한 Get은 문자열만 지원하기때문에 문자열이 아닌 다른 데이터 타입의 key를 쓴다면 오류가 발생한다. 

    MSET - 지정된 키를 해당 값으로 설정한다 . 기존의 Set과 같이 키가 있다면 값을 덮어쓴다.

    MGET - 지정된 모든 키의 값을 반환한다 , 키가 없다면 nil이 발생한다. return type array

    DECR - 키에 저장된 숫자를 하나씩 줄인다. 단, 정수로 표시할 수 있는 문자열이어야 한다. 

    키가 없다면 default값으로 0으로 설정된 값부터 시작한다.

    DECRBY - DECR과 비슷하지만 감소시킬 step을 직접 지정 가능하다.

    INCR - 키에 저장된 숫자를 하나씩 증가시킨다. 단, 정수로 표시할 수 있는 문자열이어야 한다 . 

    키가 없다면 default값으로 0으로 설정도니 값부터 시작한다.

    INCRBY - INCR과 비슷하지만 증가시킬 step을 직접 지정 가능하다.

    INCRBYFLOAT - 키에 저장된 소수점 번호를 나타내는 문자열을 지정된 step만큼 증가시키거나 감소시킨다.

    SETNX - 키가 없는경우 key value로 설정한다. 하지만 키가 이미 값을 가지고 있다면 SET과 다르게 새로운 값으로 덮어 쓰지 않습니다.

    SETRANGE - 키에 저장된 문자열의 일부를 지정된 offset에서 시작하여 전체 값의 길이로 덮어쓴다. 존재하지 않는 키는 빈 문자열로 간주하고 오프셋값으로 설정할수있는부분만 지정하고 나머지 부분은 0바이트 패딩으로 저장한다.

    STRLEN - 키에 저장된 문자열 값의 길이를 반환한다 . key의 value가 String타입이 아니라면 오류를 반환한다.

     



    2. Hash : 일반적인 Json형태
    ( Key : {
          Key: value,
           Key: value,
    })

     

     

     

    HSET - key field value: 해시에 키-값 쌍을 설정합니다.
    HGET -  key field: 해시 필드의 값을 가져옵니다.
    HGETALL - key: 해시의 모든 키-값 쌍을 가져옵니다.
    HEDEL -  key field: 해시에서 주어진 필드를 삭제합니다.
    HEXISTS -  key field: 해시 내에서 필드의 존재 여부를 확인합니다.

     

     


    3. LIst : 리스트의 형태로 저장
    ( Key : [ value1, value2 ...] )

     

     

    Node redis.List 명령어)

     

    - l로 시작하면 왼쪽부터

    - r로 시작하면 오른쪽부터 동작하는 메서드

     

     

     
    const redis = require("redis").createClient();
     
    redis.connect();
     
    redis.lPush(`searchHistory${idx}`, searchKeyword); // Key, Value : 리스트의 맨왼쪽에 값 삽입
    redis.lLen(`searchHistory${idx}`) // Key : 리스트의 길이
    redis.lRange(`searchHistory${idx}`, 0, -1);  // Key, start, end : 범위의 요소들을 가져오는 메서드 0부터시작, 마지막은 -1
    redis.lPop(`searchHistory${idx}`); // Key : 맨왼쪽 삭제
    redis.rPop(`searchHistory${idx}`); // Key : 맨오른쪽 삭제
     
     
     

     

    LPUSH - 키에 저장된 목록의 맨 좌측에 지정된 값을 모두 삽입한다. 키가 없었다면 생성

    RPUSH - 키에 저장된 목록의 맨 우측에 지정된 값을 모두 삽입한다 . 키가 없었다면 생성

    LPUSHX - 키가 이미 있고 목록이 있는 경우에만 키에 저장된 목록의 맨 좌측에 값을 삽입한다. ( 처음부터 사용할 수 없음 )

    RPUSHX - 키가 이미 있고 목록이 있는 경우에만 키에 저장된 목록의 맨 우측에 값을 삽입한다. ( 처음부터 사용할 수 없음 )

     

    LREM - 키에 저장된 목록중에서 값과 동일한 요소들을 삭제하는데 count가 0보다 작다면 우측부터 , 크다면 좌측부터 , 같다면 모든 값들을 삭제한다.

    LSET - 해당 index에 대한 값을 입력받은 값으로 변경한다.

    RPOPLPUSH - RPOP 후 LPUSH를한다. return은 POP해서 PUSH로 넣은 요소를 출력한다



    4. Set : 리스트와 동일함 ( 중복을 제거함 )
    ( Key : [ value1, value2 ...] )
    ㄴ중복된 값을 입력하면 그것은 저장이 안됨.
    예시) 일일 방문자 수( 오늘 방문한 사람들idx를 모두 저장해놓고 그 Set의 길이 ), 출석체크 이벤트, 게시글 조회수

     

     

     

    Node - redis.Set 명령어)

    const redis = require("redis").createClient();
     
    redis.sAdd - //Sets 타입의 key value 추가 ( 다중 추가 가능  Space 구분 )
    redis.sCard - //Sets 길이 반환
    redis.sMembers - //해당되는 key값 안의 요소들을 출력
    redis.sISMEMBER - //해당 요소가 Sets안에 있다면 1 없으면 0 반환
    redis.sMove - //해당 요소를 다른 key값으로 이동.
    redis.sPop - //요소에 저장된 값들중 해당 갯수만큼 랜덤으로 POP.
    redis.sRandmember - //요소에 저장된 값들중 지정된 count만큼 랜덤 반환 ( count가 없으면 1개 반환 )
    redis.sRem - //저장된 요소중에서 일치하는 요소가 있다면 삭제후 1반환 없으면 0 반환
     
     

     

     




    5. Sorted Set : Set과 동일함 ( 가중치에 따라서 자동정렬 )
    ( Key : [ { value1 : score1 }, { value2 : score2 } ... ] )
    ㄴvalue에 대한 중복값을 제거하고 score에 따라서 정렬까지 해준다.
    예시) 최근 검색어기능(스코어 : 타임스탬프), 게임 랭킹

     

     

     

     

    Sorted Set 명령어)

     

    1. ZADD: Sorted Set에 멤버와 점수 추가
      • ZADD key score1 member1 [score2 member2 ... scoreN memberN]
    2. ZREM: Sorted Set에서 멤버 제거
      • ZREM key member [member ...]
    3. ZSCORE: Sorted Set에서 멤버의 점수 가져오기
      • ZSCORE key member
    4. ZRANK: Sorted Set에서 멤버의 순위 가져오기
      • ZRANK key member
    5. ZREVRANK: Sorted Set에서 멤버의 역순위 가져오기
      • ZREVRANK key member
    6. ZRANGE: 정렬된 범위의 멤버 가져오기
      • ZRANGE key start stop [WITHSCORES]
    7. ZREVRANGE: 역순으로 정렬된 범위의 멤버 가져오기
      • ZREVRANGE key start stop [WITHSCORES]

     

     

     



     

     

    - Collection 주의 사항
    ㄴ 기본적으로 Document Database임
    ㄴ Collection 하나에는 너무 많은 데이터를 넣어두면안됨 (무조건 완전탐색을 해야한다)
    ㄴ 적절히 분할 해서 저장해야함.

     

     

     

     

     


    **Redis 정리

    -사용 주의 사항

    1. Collection의 이름
    ㄴ 그냥 단순히 String만 쓰게되면, 이건 모든 계정이 공유하겠다 라는 의미
    ㄴ idx등의 값을 이용해서 Collection 명을 지어주면됨

    ㄴ예시)

     

    redis.hGetAll(`cart${idx}`);



    ㄴ Expire Time
    ㄴ Collection에 설정할 수 있는 만료 시간 값
    ㄴ 사실 필수 설정 값
    ㄴㄴ 이거 설정안해주면 계속 메모리 차지하고있음
    ㄴㄴ 실제 장바구니도 일정기간 지나면 제거됨




    -Redis Persistence ( 영속성 )
    ㄴRedis는 RAM을 쓰기 때문에 휘발성인데, 이를 해결하기 위한 방법


    1. AOF
    ㄴ Redis가 자체적으로 제공하는 기능
    ㄴ AOF를 설정해두면, Redis가 일어나는 모든 일들을 Logging함
    ㄴ 나중에 Redis가 초기화 되었을때, 이 AOF 파일을 가지고 복구가 가능함
    ㄴ 어찌됐던 Logging 기반이기 때문에, Log파일의 용량이 갈수록 커지며 / 복구 오래걸림


    2. Snapshot
    ㄴ Redis가 자체적으로 제공하는 기능
    ㄴ Snapshot을 찍은 시점기준의 현재 Redis 값들을 저장하는 것
    ㄴ Snapshot을 찍지 못한 기간이 존재한다면, 복구가 불가능 (데이터 손실 발생)

    ㄴㄴ 1시간마다 찍다가 59분에 서버 날아가면 59분치 반영x



    3. RDB 응용
    ㄴ 일정 시간마다 Redis의 내용을 RDB에 업로드 하는 것

    ㄴ노드스케쥴러, pm2등등같은 모듈 써야함

     

     

     

     

     

Designed by Tistory.