Performans & Cache5 dk

Redis ve LRU Cache ile Backend Performans Optimizasyonu

Veritabanı yükünü %80 azaltan çok katmanlı önbellek mimarisi: Memory-cache, Redis invalidation stratejileri ve Cache-Aside deseni.

YazarŞakir Ortataş

Redis ve LRU Cache ile Backend Performans Optimizasyonu — İnteraktif Sistem Modeli

Redis & Memory

İzometrik modeli inceleyin veya sekmeler arasında geçiş yaparak farklı mimarileri keşfedin.

Milyonlarca isteğe hizmet veren backend sistemlerinde en yavaş bileşen neredeyse her zaman disk tabanlı ilişkisel veritabanlarıdır. Doğru kurgulanmış bir önbellek (cache) mimarisi, API yanıt sürelerini 300ms seviyelerinden 15ms altına indirebilir.

LRU (Least Recently Used) Çalışma Mantığı

Bellek sonsuz bir kaynak değildir. LRU önbellek mekanizması, en uzun süredir okunmayan ve en az talep gören anahtarları otomatik olarak temizleyerek bellekte her zaman en sıcak verilere yer açar.

Cache-Aside ve Write-Through Stratejileri

Uygulamalarımızda en sık başvurduğumuz desen Cache-Aside modelidir. Veri önce önbellekte aranır; bulunamazsa (cache miss) veritabanından çekilip önbelleğe yazılır ve istemciye iletilir. Veri güncellendiğinde ise ilgili önbellek anahtarları anında geçersiz kılınır (invalidation).

Cache Thundering Herd Koruması

Aynı anda binlerce istek tek bir süresi dolmuş anahtarı sorguladığında veritabanının çökmesini engellemek için mutex kilitleme veya stale-while-revalidate yaklaşımları uygulanmalıdır.

Redis ve LRU Cache ile Backend Performans Optimizasyonu · Canlı Kod BloğuPerformans & Cache · TS 5.x
Redis ve LRU Cache ile Backend Performans Optimizasyonu · Canlı Kod Bloğu
60 FPS · TS 5.x · Running
1@Injectable()
2export class HttpCacheInterceptor implements NestInterceptor {
3 constructor(@Inject(CACHE_MANAGER) private readonly cacheManager: Cache) {}
4
5 async intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>> {
6 const req = context.switchToHttp().getRequest<Request>();
7 const cacheKey = `http_cache:${req.method}:${req.originalUrl}`;
8
9 const cachedData = await this.cacheManager.get(cacheKey);
10 if (cachedData) {
11 return of(cachedData);
12 }
13
14 return next.handle().pipe(
15 tap(async (response) => {
16 await this.cacheManager.set(cacheKey, response, 600); // 10 dakika TTL
17 }),
18 );
19 }
20}
İletişim

Teknik vizyonunuzu çalışan bir ürüne dönüştürelim

TypeScript · React Native · React · NestJS · Node.js