설치 운영

우분투에서 설치

sudo apt-get update
sudo apt-get install redis-server

 

트러블슈팅

docker안에서 host의 redis에 접근하도록 하기

실행할때 다음처럼 --network host만 붙여주면 된다.

#!/bin/bash

PORT=$1

docker run \
  --network host \
  -e SPRING_APPLICATION_JSON='{"server":{"port":'"$PORT"'}}' \
  -p $PORT:$PORT \
  auth-service

 

설계관점

 

유사한 목적(“캐시-미스 시 DB에서 데이터 가져와 캐시에 채우기”)을 갖고 있지만, 구현 주체흐름 제어가 다릅니다.

 
Read-Through vs Write Through
둘다 캐시라이브러리를 쓰는 형태

 

항목 Read-Through Write-Through
읽기(Read) 애플리케이션이 cache.get(key)만 호출
– miss 시 캐시 라이브러리가 DB에서 가져와 자동으로 채워 줌
애플리케이션이 cache.get(key)만 호출
– miss 시 캐시→DB 채우기(읽기 방식은 동일)
쓰기(Write) 애플리케이션이 DB에 직접 쓰고,
캐시는 별도 무효화 로직(예: Cache-Aside) 필요
애플리케이션이 cache.put(key, value) 호출
– 캐시에 먼저 쓰고, 라이브러리가 동기적으로 DB에도 써 줌
앱 코드 관점 • Read: cache.get(key)
• Write: db.save(...) + 별도 cache.del(key)
• Read: cache.get(key)
• Write: cache.put(key, value) (내부에서 DB 쓰기까지 수행)
 
  • Read-Through는 애플리케이션이 캐시에 get()만 호출하면 되고,
    쓰기는 보통 DB에 직접 쓰고 캐시 무효화를 따로 처리
  • Write-Through는 애플리케이션이 읽을 땐 get(), 쓸 땐 put()을 호출하며,
    put()이 캐시와 DB 쓰기를 동기적으로 처리해 줌
 
Cache-Aside vs Read-Through

 

항목 Cache-Aside Read-Through
핵심 아이디어 앱이 직접 “캐시 꺼내→DB 가져와→캐시 세팅” 캐시 라이브러리가 “get() 호출만으로 내부에서 DB 조회→캐시 세팅”
누가 제어하나 애플리케이션 코드 캐시 미들웨어 / 프레임워크
코드 호출 방식 cache.get → miss? db.query → cache.set cache.get 만 호출
쓰기(무효화) db.update 후 애플리케이션이 cache.del 보통 Write-Through와 결합해 cache.put→db.write
자동화 수준 수동 로직(직접 구현) 캐시 솔루션에 내장 (투명하게 작동)
 

결론:

  • 목적은 같지만,
  • Cache-Aside는 “앱이 직접 관리”
  • Read-Through는 “라이브러리가 대신 관리”

 

 

Write-Through vs Write-Back

 

항목 Write-Through Write-Back
핵심 아이디어 캐시에 쓰면 즉시 동기적으로 DB에도 쓰기 캐시에 먼저 쓰고, 나중에 배치나 트리거로 DB에 반영
쓰기 흐름 1. cache.put(key, value) 호출
2. 캐시 저장 완료 후
3. 즉시 DB 쓰기
1. cache.put(key, value) 호출
2. 캐시만 업데이트
3. 일정 시점에 Dirty-entry를 모아서 DB 쓰기
DB 쓰기 타이밍 동기적, 쓰기 호출 시점에 바로 반영 비동기적, 지연(예: TTL, 배치, evict 시점)에 반영
데이터 일관성 보장 강력(쓰기 직후 DB와 캐시 일치) 약함(아직 DB에 반영되지 않은 쓰기 데이터가 캐시에만 존재할 수 있음)
쓰기 레이턴시 상대적으로 높음(캐시+DB 두 번 쓰기) 상대적으로 낮음(한 번만 캐시에 쓰기)
장애 복구 & 내구성 쓰기 실패 시 즉시 예외 처리 가능 캐시 장애나 장애 복구 시 Dirty 데이터 유실 위험
캐시 오염(Dirty) 관리 없음 “Dirty bit” 관리 필요 → evict, 주기적 flush 로직 구현
구현 복잡도 낮음(동기 쓰기만 구현) 높음(Dirty 식별·스케줄·재시도 로직 등 추가)
적합한 사용 사례 • 데이터 일관성이 최우선일 때
• 쓰기 빈도가 낮거나 허용 가능한 레이턴시일 때
• 쓰기 빈도가 매우 높고, 약간의 지연 반영을 허용할 때
• DB 부하 완화가 급선무일 때
반응형

'Programming > Linux' 카테고리의 다른 글

docker-compose  (0) 2023.10.28
Nginx  (1) 2023.08.16
kafka  (0) 2023.07.31
ELK연습  (0) 2023.07.30
스팍 - 실습 - 웹서버 세션분석  (0) 2023.07.30

+ Recent posts