일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- N+1
- 포트번호
- 알림생성모듈
- 환경변수
- element.style
- 게시글 이미지
- 쿼리스트링
- 알림생성
- JWT 쓰는이유
- JSON Web Token
- JWT 쓰는 방법
- 메뉴바
- getComputedStyle
- 패스파라미터
- 토큰
- 레포지토리
- 이미지가 포함된 게시글
- N+1문제
- unnest
- .env
- 부트캠프
- route 53
- 메뉴바 한번에
- 3계층구조
- Winston
- 네비게이션 한번에
- 게시글 이미지 업로드
- 스테이지어스
- secret코드
- JWT
- Today
- Total
기주
db) Redis 본문
-정의
ㄴ 일종의 데이터베이스 (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로 시작하면 오른쪽부터 동작하는 메서드
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 명령어)
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 명을 지어주면됨
ㄴ예시)
ㄴ 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 |
---|