참고
개요
- 일반적으로 데이터베이스는 저장장치에 저장이 되는데, 데이터베이스를 조회하려면 저장장치로 i/o가 발생
- 캐시는 in-memory 방식을 활용하여 데이터를 임시로 저장해두기 때문에 훨씬 빠르게 동작할 수 있다.
- 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장 하여 조회하고 없을 때 데이터베이스를 다시 조회하는 방식을 활용하면 서비스의 속도를 향상시킬 수 있다
Redis 란
- Remote dictionary server
- "key-value" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템
- in-memory 상태에서 데이터를 처리함으로써 관계형 데이터베이스(RDS), 문서형(Document) 데이터베이스보다도 빠르고 가볍게 동작
- 다만 메모리에 데이터를 저장하기 때문에 서버가 꺼지면 모든 데이터가 사라진다는 단점이 있다.
- 이런 특징으로 인해서 Redis는 전체 서비스에서 속도 향상을 위한 보조 데이터베이스로 사용되는 것이 보편적
- 데이터에 만료시간을 지정하여 만료시간이 지나면 삭제되도록 할 수 있으며, 만료되지 않았지만 메모리가 꽉 찼을때도 LRU(Least recently used) 알고리즘에 의해 데이터가 사라진다.
Race Condition 해결 * Race Condition * 여러 개의 Thread가 경합하는 것 * Context Switching 에 따라 원하지 않는 결과가 발생 * Redis는 기본적으로 Single Threaded * Redis 자료구조는 Atomic Critical Section에 대한 동기화를 제공 * 서로 다른 Transaction Read/Write를 동기화
Redis 데이터 구조
- Redis는 RDS와 달리 데이터 타입(VARCHAR, INT, DATETIME) 등을 지원하지 않음
-
오직 몇 가지 로우 레벨의 데이터 타입을 지원
-
문자열(String)
- 해시(Hash)
- 리스트(List)
- 셋(Set)
Redis 데이터 처리
- Redis는 "key-value" 데이터 구조로 매우 간단하게 데이터를 처리할 수 있다.
- 데이터 입력/수정/삭제/조회에 대하여 아래와 같은 명령이 제공
종류 | 역할 |
---|---|
set | 데이터 저장 |
get | 저장된 데이터 조회 |
rename | 저장된 데이터 변경 |
randomkey | 저장된 key 중에 하나의 key를 랜덤하게 검색 |
keys | 저장된 모든 key를 검색 |
exists | 검색 대상 key 존재 여부 확인 |
mset | 여러 개의 데이터 저장 |
mget | 여러 개의 데이터 검색 |
Redis 사용이 필요한 경우
- 운영 중인 웹 서버에서 키-값 형태의 데이터를 처리해야 하고, I/O가 빈번히 발생해 다른 저장방식을 사용하면 효율이 떨어지는 경우 사용
Redis 사용예시
- 사용자의 세션 관리
- 게시물의 조회수
- 유튜브를 생각해보면 인기 채널의 신규 동영상은 1시간도 안되어 100만 조회수를 넘기는 경우도 있다.
- 조회수에 해당하는 데이터를 Redis에 저장해 캐싱 처리
- 일정한 주기에 따라 RDS에 업데이트를 해 RDS에 가해지는 부담을 크게 줄이고 성능을 향상시킨다.
주의
- Single Thread 서버 이므로 시간 복잡도를 고려해야
- in-memory 특성상 메모리 파편화, 가상 메모리 등의 이해가 필요