3. 코드 기반 분석
Look-aside 구현
Redis에 모든 데이터 저장 및 PostgreSQL 백업 조회:
redis_articles = redis_client.keys(redis_key_pattern)
if redis_articles:
redis_articles_data = [
json.loads(redis_client.get(article_key))
for article_key in redis_articles
]
else:
db_articles = News.objects.filter(category=category).order_by('-created_at')
for article in db_articles:
redis_key = f"news:{category.name.lower()}:{article.id}"
redis_client.set(
redis_key,
json.dumps({
"title": article.title,
"abstract": article.abstract,
"summary_english": article.summary_english,
"summary_korean": article.summary_korean,
"vocab": article.vocab,
"url": article.url,
"category": category.name,
"created_at": article.created_at.isoformat(),
}),
ex=86400
)
모든 크롤링 데이터를 Redis에 저장하고, 캐시 미스 시 PostgreSQL에서 데이터를 가져옴.
사용자가 본 기사 데이터를 Redis에 관리(viewed_articles_key)
Write-through 구현
Redis와 PostgreSQL 동시 쓰기:
redis_client.set(redis_key, redis_value, ex=86400)
News.objects.update_or_create(
url=article['url'],
defaults={
'title': article['title'],
'abstract': article['content'],
'summary_english': summary_english,
'summary_korean': summary_korean,
'vocab': vocab,
'category': category,
}
)
데이터를 Redis와 PostgreSQL에 동시에 저장해 데이터 일관성 유지.
Redis에 즉시 데이터를 반영하여 실시간 사용자 요청을 지원.
4. 결론
Look-aside와 Write-through 전략은 이 프로젝트의 특성과 요구 사항에 가장 잘 맞는 선택입니다:
Look-aside는 크롤링된 모든 데이터를 캐시에 저장하며, 사용자 요청 시 캐시를 우선 조회하고 필요 시 DB를 조회합니다.
Write-through는 Redis와 PostgreSQL 간 데이터 동기화를 유지하며, 실시간 데이터 제공과 데이터 일관성을 보장합니다.
'프로젝트' 카테고리의 다른 글
비동기 작업 도구 선택 (1) | 2025.01.27 |
---|---|
DB설계 전략 (0) | 2025.01.23 |
도커 실행 시 크롬드라이버와 크롬 버전 불일치 (1) | 2025.01.22 |
ResourceExhausted (0) | 2025.01.21 |
소셜계정 연동 시 중복확인 문제 (0) | 2025.01.20 |