https://slender-danger-059.notion.site/Redis-faa4acc3f64e4b1d9ab02eef6dd671f6
Remote(외부) dictionary(Key-Value) server(서버)
외부 딕셔너리 서버
- 평균 작업속도 < 1ms
- 초당 수백만 건의 작업
클라이언트에서 Server#1에 로그인 요청을 함.
Server#1에서 클라이언트 정보를 세션에 저장.
트래픽이 많아져서 서버가 스케일아웃(수평 확장)됨.
로드밸런서가 클라이언트의 요청을 Server#2로 보냄.
Server#2에는 클라이언트의 정보가 세션에 없음.
Redis를 세션 스토어로써 활용 가능.
물론, DB를 세션 스토어로 사용이 가능하겠지만 속도측면에서 많은 차이.
클라이언트 - 웹서버 - 데이터베이스
데이터를 캐시할 수 없을까
클라이언트 - 웹서버 - Redis - 데이터베이스
클라이언트에서 웹서버에 데이터 요청
문제점
쿼리중 UPDATE.. 등은 해당사항이 없으며 조회성(SELECT)만 가능.
그리고, 데이터베이스에 있는 데이터가 바뀌게 되면 싱크가 안맞게 됨.(상품 가격 바뀐거 반영 못한다던가 등)
따라서, 주로 사용하지만 거의 바뀌지 않는 데이터(config, 결과값 등)
1) 용량 등 효율적인 면에서
2) 성능 측면에서
캐시에서만 데이터를 읽어오는 전략
<단점>
단건 조회가 많을 경우 그래서 데이터를 조회하는데 있어 속도가 느림.
데이터 조회를 전적으로 캐시에만 의지해서 redis가 다운될 경우 서비스 이용에 차질이 생김.
<장점>
캐시와 DB간 동기화가 항상 이루어져 데이터 정합성 문제는 없음.
읽기가 많은 프로젝트에 적합
cache hit → cache store에 데이터가 있을 경우 바로 가져옴
cache miss → cache store에 데이터가 없을 경우 DB에서 가져옴
<순서>
클라이언트가 서버에 데이터 요청
이 방식은 직접적인 DB 접근과 읽기에 소모되는 자원을 최소화할 수 있음. 하지만 캐시에 문제가 생길 경우 서비스 전체가 중단 됨. 그렇기 때문에 Replication(복제) , Cluster(수평 확장, 백업 등)로 구성해야 됨.
데이터를 찾을때 우선 캐시에 저장된 데이터가 있는지 우선적으로 확인. 만일 캐시에 데이터가 없으면 DB에서 조회하는 전략
<단점>
캐시에 커넥션이 많아져서 redis가 다운되면 DB로 몰려서 부하 발생
<장점>
캐시와 DB가 분리되어 원하는 데이터만 별도로 구성하여 캐시에 저장
캐시 장애 대비 구성이 되어 있음.
<순서>
클라이언트가 서버에 데이터 요청
이 방식은 캐시에 장애가 발생하더라도 DB에 요청을 전달하여 캐시 장애로 인한 서비스 문제는 대비할 수 있지만, 캐시와 DB간 정합성 유지 문제가 발생할 수 있음. 단건 호출 빈도가 높은 서비스에 적합하지 않음.
<전>
<후>
저번에 알아봤던 ETag같은 경우는 네트워크 통신간 Size가 줄어 들어 비용을 아끼고 성능을 개선하는 효과를 얻을 수 있었고, Redis를 통한 캐싱전략은 성능개선의 효과가 큰것을 알 수 있었음.