-
-정의
ㄴ 일종의 데이터베이스 (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부터시작, 마지막은 -1redis.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 명령어)
- ZADD: Sorted Set에 멤버와 점수 추가
- ZADD key score1 member1 [score2 member2 ... scoreN memberN]
- ZREM: Sorted Set에서 멤버 제거
- ZREM key member [member ...]
- ZSCORE: Sorted Set에서 멤버의 점수 가져오기
- ZSCORE key member
- ZRANK: Sorted Set에서 멤버의 순위 가져오기
- ZRANK key member
- ZREVRANK: Sorted Set에서 멤버의 역순위 가져오기
- ZREVRANK key member
- ZRANGE: 정렬된 범위의 멤버 가져오기
- ZRANGE key start stop [WITHSCORES]
- 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등등같은 모듈 써야함 - ZADD: Sorted Set에 멤버와 점수 추가