📝 Redis (Remote Dictionary Server)Redis 특징Redis 데이터 구조StringHashListSetSorted SetGeospatial IndexRedis 스키마Redis 키Redis 유의 사항Redis 키 삭제 방법Redis 시작하기저장, 조회, 삭제, 수정Refer화이트 보드Redis 고려사항Redis를 쓰는 이유Redis 특징Redis 단점🎳 SFAM 프로젝트 - Redis 적용기
📝 Redis (Remote Dictionary Server)
“키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스기반의 비관계형 데이터베이스 관리 시스템(DBMS) -위키백과
Redis 특징
- Single Thread
- 한 번에 하나의 명령만 처리 가능
- 중간에 처리 시간이 긴 명령어가 들어갈 경우 뒤의 명령어들이 대기
- get, set 명령어의 경우 초당 10만개 이상 처리가 가능하다.
- 인메모리 데이터 베이스
- 모든 데이터를 메모리에 저장하고 조회
- 디스크 저장
- 현재 메모리 상태를 디스크에 스냅샷 형태로 남길 수 있다.
- restart 할 때 스냅샷에 있는 내용으로 쉽게 복구 가능하다.
Redis 데이터 구조

String
- 거의 대부분의 데이터를 String으로 표현
- 숫자, 날짜, 시간 …
Hash
- 필드를 가질 수 있다
- 사용자 정보라는 해시가 있다면 이메일과 닉넴임을 가질 수 있다.
- 전체를 가져오거나 개별 필드를 가져올 수 있다.
List
- 연결 리스트로 배열의 왼쪽, 오른쪽에 엘리먼트를 추가할 수 있다.
- 데이터는 문자열만 가능
Set
- String의 집합으로 여러 개의 값을 하나의 value에 넣을 수 있다.
- 포스트의 태깅에서 사용 가능
Sorted Set
- 중복된 데이터를 담지 않는 Set 구조에 정렬을 적용
- 랭킹 보드 서버 구현에 사용 가능
Geospatial Index
- 지리 공간에 대한 고유한 데이터 유형
- GEOADD [추가하려는 집합] [경도] [위도] [멤버 이름]

- 두 지리 공간의 거리 차

- 특정 지점에서 반경 내에 어떤 항목이 있는지

Redis 스키마
- 데이터를 정규화하고, 데이터의 로우에 대해 일관된 레퍼런스를 가지게 해주는 용도
- 사용자의 이메일, 닉네임, 최근 로그인 시간을 레디스에 저장하면
- user:userId:email:문자열
- user:userId:nickname:문자열
- user:userId:lastLogin:문자열
- 데이터를 : 로 구분하여 접근 가능하다.
- 스키마를 활용하면 userId만 알아도 연결된 데이터인 email, nickname, lastLogin 을 알 수 있다.
Redis 키
- 레디스의 검색은 O(1)의 수행시간을 가지고, 스키마의 양과 상관없이 동일한 시간이 사용된다.
Redis 유의 사항
- 레디스는 한 번 생성한 키를 선택적으로 삭제하기 어렵다.
- 특별한 조치를 하지 않으면 키는 삭제가 아닌 보관되며 서버 재실행 후에도 유지된다.
Redis 키 삭제 방법
- 일괄 삭제
- FLUSHDB 명령어를 통해 모든 키를 파괴
- 복구가 불가능하며 개발 수준에서 사용
- 일정 시간 이후 삭제
- 키를 저장할 때 셋에 저장하여 특정 시간이나 조건에 따라 삭제하는 방법
- 삭제라기 보다는 밀어내기라 이해할 수 있다.
- 셋은 하나의 키에 대해 여러 번 등록해도 하나의 데이터만 남는 특징이 있다.
- 교집합, 차집합, 합집합과 같은 기능을 제공한다.
- 교차되는 키만 남거나 뺀 연산을 적용하여 키 삭제 가능
- 기간 만료 후 삭제
- 키-값을 SET 커맨드로 저장해 EXPIRE 커맨드로 기간 만료 시간을 정하는 방법
- 레디스 2.0.0 이상에서는 SETEX 커맨드를 사용하는 방법 (SET + EXPIRE)
- 키를 추적할 필요가 없고 관리에 용이하다.
Redis 시작하기
brew install redis ## redis 설치 brew services start redis ## redis 시작 brew services stop redis ## redis 중지 brew services restart redis ## redis 재시작 redis-cli ## CLI
저장, 조회, 삭제, 수정
set [key] [value] ## string 저장 get [key] ## 해당 key 의 값 조회 del [key] rename [key] [newkeyname] sadd [key] [value] [value] [vaule] ... ## set smembers [key] ## set 조회
Refer
화이트 보드
Redis 고려사항
- 캐시용으로 사용할 것인지, 저장소용으로 사용할 것인지 분명히 해야 한다.
Redis에 저장되었던 데이터가 없어져도 같은 데이터가 RDBMS에 남아있어 문제가 없거나,
혹은 일부 값이 유실되어도 괜찮은 경우인지 확인해야 한다.
데이터운영팀에서는 특별한 경우가 아니면 Redis를 영구 저장소용으로 사용하는 것을 권장하지 않는다.
Redis의 데이터를 파일로 보관하기 위한 Persistence 기능(RDB, AOF)으로 인한 장애발생 가능성 매우 큼!
Redis를 쓰는 이유
- 많은 양의 데이터를 효율적으로 처리
- 데이터의 분산처리, 빠른 쓰기 및 데이터의 안정성
Redis 특징
- Key-Value Store
레디스는 거대한 Map 데이터 저장소
장점은 익히기 싶고 직관적이지만,
단점은 Key-value 형태로 저장된 데이터를 레디스 자체내에서 처리하는 것이 어려움
- 다양한 데이터 타입
리스트 형 데이터의 입력과 삭제가 MySQL 보다 10배 정도 빠르다?
등등 다양한 데이터 형식을 지원함
- Persistence
- 저장 방식
- snapshot : 메모리 내용을 *.rdb 파일로 저장하여 해당 시점의 데이터를 복구 가능
- AOF : 레디스의 모든 write/update 연산 자체를 log로 기록 → 재시작 되면 log 기반으로 순차적으로 재실행, 데이터를 복구
Redis는 데이터를 Disk에 저장할 수 있음.
→ Redis가 셧다운된 후에도 재시작 해도 저장된 데이터를 다시 읽을 수 있어 유실되지 않음.
레디스 공식문서의 권장사항은 RDBMS의 rollback 시스템과 같이 두 방식을 혼용해서 사용하는 것
주기적으로 snapshot 백업 후 다음 snapshot까지 저장을 AOF 방식으로 수행
- ANSI C로 작성
C언어로 작성되어 Java와 같이 가상머신 위에서 동작하는 언어에서 발생하는 성능 문제애 대해 자유로움
곧바로 기계어로 동작하지 않고 어떤 가상의 머신 위에서 인트프리터된 언어로 가동되는 경우에는
Gargage Collection 동작에 따른 성능 문제가 발생할 수 밖에 없다.
- 서버 측 복제 및 샤딩을 지원???? 뭔 개소리여
Redis 단점
- 메모리 파편화가 발생하기 쉬움 메모리를 2배로 사용하고 싱글 스레드이다.
- 긴 Transaction이 드어오면 그 Tx를 사용하기 위해 다른 Requestfmf 처리 못하는 현상이 발생… 대표적으로 Flushall 이나 Keys는 List 전체를 Scan하는 구조로, 100만개 처리시 1초, 1000만개 10초, 1억개는 100초가 소요…
→ 이를 위해 데이터를 하나의 컬렉션이 아닌 여러개의 컬렉션에 나눠서 처리하는 것이 좋다.
각 컬렉션당 10,000 개의 데이터 저장 추천
- copy-on-write 방식을 사용 : 스냅샷을 뜰 때 자식 프로세스를 하나 만들어 낸 후 변경된 메모리 페이지를 복사해서 사용
보통 Redis를 사용할 때는 데이터 변경이 잦아 실제 메모리 크기만큼 자식 프로세스가 복사….
→ 실제로 필요한 메모리보다 더 많은 메모리를 사용된다.
- 주제만 봤을때 한번 슥 이해할 필요가 있을려나? 🤔
- 좋은 정리글
🎳 SFAM 프로젝트 - Redis 적용기
JWT Refresh 토큰 - Redis 적용
작성 중…