기주

db) Redis 본문

DBMS/Redis

db) Redis

기주그지마 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등등같은 모듈 써야함

 

 

 

 

 

'DBMS > Redis' 카테고리의 다른 글

[redis] 캐싱으로 조회수기능 개선하기  (0) 2024.11.27