[Redis] Redis 와 Cache, Memcached
현대 웹서비스에서는 캐시의 역할이 중요하다. 서비스의 규모가 커져감에 따라 모든 요청을 DB직접 참조 또는 API호출로 처리한다면 성능과 에러 등과 같은 이슈가 발생할 수 밖에 없다.
Cache
Cache란
캐시란 나중에 요청한 결과를 미리 저장해둔 후 빠르게 서비스를 해주는 것을 의미
즉 미리 결과를 저장하고 나중에 요청이 오면 DB또는 API가 아닌 캐시로 접근하여 요청을 처리
캐시가 동작할 수 있는 철학에는 파레토 법칙이 있다
파레토 법칙 → 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생한다
즉 캐시가 효율적일 수 있는 이유는 모든 것을 캐시하는 것이 아니라 많이 사용되는 20%를 캐싱한다면 전체적으로 영햐을 주어 효율을 극해화할 수 있다
캐시 사용구조
기본적으로 캐시는
클라이언트 요청 → 캐시와 작업 → 실제 DB와 작업 → 다시 캐시와 작업
여기서 동일한 flow를 어떻게 사용하냐에 따라 Look aside cache(lazy loading)과 write back으로 나뉜다
1. Look aside cache
- 클라이언트에서 데이처 요청
→ 서버에서 캐시에 데이터 존재 유무 확인
→ 데이터가 있다면 캐시의 데이터 사용(빠른 조회)
→ 데이터가 없다면 실제 db 데이터에 접근
→ 그리고 db에서 가져온 데이터를 캐시에 저장하고 클라이언트에 반환
여기서 cache miss와 cache hit 라는 용어가 사용된다
cache miss : 메모리에 찾고자 하는 데이터가 없어 디스크에 조회(DB조회)
cache hit : 메모리에 찾고자 하는 데이터가 있을때
2. write back
-웹서버는 모든 데이터를 캐시 서버에 저장
→ 캐시 서버에 특정 시간동안 데이터가 저장됨
→ 캐시 서버에 있는 데이터를 DB에 저장
→ DB에 저장된 캐시 서버의 데이터를 삭제
- insert 쿼리를 일일이 한번에 날리지 않고 한거번에 배치처리하기 위해 사용
- 다만 캐시 서버가 죽으면 데이터가 유실된다는 문제점
→ 다시 재생 가능한 데이터나, 극단적으로 heavy한 데이터에서 write back방식을 많이 사용
캐시 사용 사례
1. CPU
- 자주 사용되는 정보들에 대해 캐시기능 지원
2. Http
- 동일한 API요청에 대해 반복적으로 요청하지 안도록 클라이언트에서 요청별 키를 관리하여 캐싱
3. CDN resource Caching
- CDN : 지리적으로 분산된 서버들을 연결한 네트워크
- 정적 리소스 캐싱을 위해 CDN에 리소스를 배치
- 리소스는 CDN 지역 전체에 복제되어, 사용자는 가까운 지역의 리소스에 빠르게 접근하여 사용
Redis
- key-value 구조 데이터 관리 서버 시스템
- key-value 구조란 mysql 같은 관계형 데이터가 아닌 비관계형 구조로서 '키-값'형태로 단순하게 저장
- 쿼리르 날리지 않고 겨과를 얻을 수 있음
- 비관계형 구조로 일종의 NOSQL로 분류되기도 함
NOSQL ?
기존 관계형 데이터베이스(RDMS)보다 융통성이 있는 데이터 모델을 사용하고 데이터의 저장 및 검색을 위한 특화된 메커니즘을 제공하는 데이터 저장기술
단순 검색, 추가작업에 있어 매우 최적화된 키-값 저장기법을 사용해 응답 속도나 처리 효율등에 있어 매우 뛰어난 성능을 보여줌
- 인메모리 솔루션으로 다양한 데이터 구조체를 지원함
- →인메모리 : 데이터를 주로 메모리(RAM)에 저장하고 처리하는 데이터 처리 기술
- →DB, Cache, Message Queue, Shared Memory 용도로 사용가능
- Collection 자료 구조를 지원함
- String : 가장 일반적인 key - value 구조의 형태
- Sets : String의 집합입니다. 여러 개의 값을 하나의 value에 넣을 수 있습니다. 포스트의 태깅 같은 곳에 사용됨
- Sorted Sets : 중복된 데이터를 담지 않는 Set 구조에 정렬 Sort를 적용한 구조로 랭킹 보드 서버 같은 구현에 사용
- Lists : Array 형식의 데이터 구조입니다. List를 사용하면 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입하거나 삭제하는 것은 어려움
- 싱글 스레드임 -> thread sage 함 (연산을 하나씩 처리해서)
- 한번에 하나의 명령어만 처리가능
- 중간에 처리시간이 긴 명령어가 들어오면 그뒤 명령어는 대기상태
- 메모리기반이지만 영속적이 데이터 보전이 가능(메모리는 원래 휘발성)
- 스냅샷 기능을 제공해 메모리 내용을 *.rdb 파일로 저장하여 해당 시점으로 복구가능
- 여러 프로세스가 동시에 Key에 대한 갱신을 요청하는 경우, 데이터 부정합 방지 atomic처리 함수를 제공(원자성)
Memcached
RDMS에도 mysql,mssql,oracle 등 종류가 있듯이
인메모리db에도 다양한 데이터베이스가 존재한다
그중 가장 많이 사용하는 것이 redis와 memcached이다.
두개의 공통점은
- 인메모리 저장소라는 점
- key-value 의 저장방식을 가진다는 점
- 대용량 트랙픽을 고려하여 사용한다는 점
Memcached와 redis
Redis | Memcached | |
스레드 | 싱글 스레드 | 멀티 스레드 |
데이터 구조 | 다양한 자료 구조 지원 | string,integers만 지원 |
데이터 저장 | memory,disk | memory |
처리속도 | memcached보다 느리지만 큰 차이 없다 | 디스크를 거치지 않아 redis보다 빠름 |
Replication | 지원 | 지원 x |
Partitioning method | 지원 | 지원 x |
영속성 | 영속성 있는 데이터 사용 | 지원안함 |
- Replication
→ 주서버와 하나이상의 복제 서버간의 데이터 복제를 의미
→ 주 서버는 쓰기 작업을 처리하고, 복제 서버는 주 서버의 데이터를 복제하여 읽기 요청에 응답
→ 데이터 손실을 방지하고 가용성을 제공
- Partitioning
→ 데이터 베이스의 데이터를 여러 서버 노드로 분산하는데 사용
→ 대규모 데이터 집합을 여러 서버로 분할하여 각 서버에서 데이터를 독립적으로 관리하고 처리