회사에서 솔루션 고도화 진행 중에 이메일 인증 절차를 개발하게 되었는데 이때 인증을 위해 DB에 계속 요청해야 하는가?에 대한 의문이 들었다. 이메일을 이미 받았는지, 인증시간이 만료되었는지 등등 확인할 게 많은데 말이다.. 그래서 사수와 의견공유를 한 뒤 Redis를 도입하게 되었다. 앞으로는 AWS Redis를 사용할 예정이며, Redis를 많이 들어보긴 했지만 처음해보기도 하고 정확하게.. 뭔지 몰라서 정리하게 되었다.
근데 사수가 바로 연결이 안된다고 해서 local에서 테스트보라고 했는데.. 이게 무슨말이야.. 나는 1년차 개발자 응애
Redis를 선택한 이유?
DB는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않는다는 장점이 있으나, 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려진다는 단점이 있어 캐시 서버를 도입하려 했고 Redis는 세션관리에 매우 적합하므로 인증 토큰을 사용하기에 알맞은 서버라고 생각했음
# Redis?
- Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비 관계형 데이터 베이스 관리 시스템
- 데이터베이스, 캐시, 메세지 브로커로 사용됨
- 인메모리 데이터 구조를 가진 저장소
- 영속성(Persistence) 보장을 위해 보관&백업 기능 존재
# 캐시
한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결과를 얻을 수 있도록 도와주는 공간으로 같은 요청이 여러번 들어올 경우 캐시 서버에서 첫 번째 요청 이후 저장된 결과값을 주기 때문에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않음
- Look aside cache 패턴
- 클라이언트가 데이터를 요청
- 웹서버는 데이터가 존재하는지 Cache 서버에 먼저 확인
- Cache 서버에 데이터가 있으면 DB에 데이터를 조회하지 않고 Cache 서버에 있는 결과값을 클라이언트에게 바로 반환 (Cache Hit)
- Cache 서버에 데이터가 없으면 DB에 데이터를 조회하여 Cache 서버에 저장하고 결과값을 클라이언트에게 반환 (Cache Miss)
- Write Back 패턴
- 웹서버는 모든 데이터를 Cache 서버에 저장
- Cache 서버에 특정 시간 동안 데이터가 저장됨
- Cache 서버에 있는 데이터를 DB에 저장
- DB에 저장된 Cache 서버의 데이터를 삭제
# Redis 특징
- key-value 구조이기 때문에 쿼리를 사용할 필요가 없음
- 메모리에서 데이터를 처리하기 때문에 속도가 빠름
- 다양한 자료구조 지원 : String, Bitmap, Hash, List, Set, Sorted Set, Geospatial Index, Hyperloglog, Stream
- String : 가장 일반적인 key - value 구조의 형태
- Sets : String의 집합으로 여러 개의 값을 하나의 value에 넣을 수 있고 포스트의 태깅 같은 곳에 사용될 수 있음
- Sorted Sets : 중복된 데이터를 담지 않는 Set 구조에 정렬 Sort를 적용한 구조로 랭킹 보드 서버 같은 구현에 사용
- Lists : Array 형식의 데이터 구조로 List를 사용하면 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입하거나 삭제하는 것은 어려움
- 메인 스레드는 싱글 스레드로 운용됨
- 한 번에 하나의 명령만 처리할 수 있음
- 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요함
- get, set 명령어의 경우 초당 10만 개 이상 처리할 수 있을 만큼 빠름
- 한 번에 하나의 명령만 처리할 수 있음
# 주의할 점
- 서버에 장애가 발생했을 경우 그에 대한 운용 플랜이 필요함
- 메모리는 한정적이기 때문에 관리가 중요함
# 메모리 관리
- key에 Expire를 설정할 것을 권장함
- 동일한 key가 다시 들어오면 timeout이 재설정됨
- Expire는 개별 Collection의 item key단위로는 설정할 수 없음
# Expire이 되는 기준
- key에 대한 접근이 발생할 때
- (내부 스케줄러) activeExpireCycle 에 의한 삭제
- command 처리 전에 memory가 부족할 때 메모리 정책에 따라서 삭제
# Persistence
휘발성 데이터이므로 서버에 장애가 생기면 데이터가 날라가기 때문에 이런 문제를 해결하고 영속성을 위해 2가지 방식을 지원함
- AOF(Append Only File)
- 보관
- 명령이 실행될 때마다 파일에 기록함
- 입력/수정/삭제
- 계속 수행하면 기록되는 파일의 size가 커지는데 이때문에 기록이 중단된다 하더라도 rewrite하면 size가 작아짐
- 입력/수정/삭제에 대한 최신 로그만 기록
- aof 파일을 통해 영속성 보장
- RDB(snapshot)
- 백업
- 특정한 간격으로 메모리에 있는 Redis 데이터 전체를 Disk에 바이너리 형태로 기록함
- AOF보다 size가 작으며 로딩 속도도 빠름
# Local Redis
AWS에서 테스트 하기 전에 local docker 환경에서 먼저 테스트를 진행함
docker pull redis
docker run --name local-redis -p 6379:6379 -d redis //6379:Redis 기본포트
docker ps
docker exec -it local-redis /bin/bash
redis-cli
## redis-cli 진입 이후
# 데이터 넣기 / test=key, value=value
127.0.0.1:6379> set test value
OK
# 데이터 조회 = key로 조회
127.0.0.1:6379> get test
"value"
# 데이터 검색 = keys *키이름*
127.0.0.1:6379> keys *t*
1) "test"
127.0.0.1:6379> keys t* //t로 시작하는 키
1) "test"
127.0.0.1:6379> keys st* //st로 시작하는 키
(empty array)
127.0.0.1:6379> keys *st //st로 끝나는 키
1) "test"
# 모든 키 확인
127.0.0.1:6379> keys *
1) "test"
2) "testt"
# 키 삭제
127.0.0.1:6379> del test
(integer) 1
127.0.0.1:6379> del testt
(integer) 1
127.0.0.1:6379> keys *
(empty array)
# 모든 데이터 삭제
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
# 이름 변경하기
127.0.0.1:6379> set test01 value01
OK
127.0.0.1:6379> keys *
1) "test01"
127.0.0.1:6379> rename test01 test02
OK
127.0.0.1:6379> keys *
1) "test02"
참고)
https://aws.amazon.com/ko/elasticache/what-is-redis/
https://wildeveloperetrain.tistory.com/21
https://sjh836.tistory.com/178
Redis란 무엇입니까? – Amazon Web Services(AWS)
Redis 개발자는 백 개가 넘는 오픈 소스 클라이언트를 사용할 수 있으며, Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go를 비롯한 다수의 언어가 지원됩니다.
aws.amazon.com
Redis란? 레디스의 기본적인 개념 (인메모리 데이터 구조 저장소)
Redis란? Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리
wildeveloperetrain.tistory.com
Redis 기본 개념 (기초, Collection 타입, Expire, Persistence)
참조문서 https://redis.io/documentation https://github.com/antirez/redis https://redislabs.com/redis-enterprise/data-structures/ 명령어 목록 : https://redis.io/commands 1. redis란? redis는 REmote DIctionary Server의 약자이다. C언어로 작
sjh836.tistory.com
갤탭으로 작성하는건데 뭔가 예쁘게 작성을 못하겠다 ㅜㅜㅜ
다음에는 Redis 코딩으로 돌아오겠다ㅏ..