Problem
Skoryum AI'da her maç için REST API'den 64.328 x 8 veri noktası çekiyorduk. Bu yaklaşık 500KB+ JSON verisi demek ve her seferinde API çağrısı yapmak ciddi bir performans sorunu yaratıyordu:
- İlk yükleme süresi: ~14 saniye
- Her sayfa geçişinde yeniden fetch
- Kullanıcı deneyimi berbat
Çözüm: Hive Cache Stratejisi
Flutter ekosisteminde Hive, key-value store olarak mükemmel bir seçim. SQLite'a göre çok daha hızlı ve Flutter'a özel tasarlanmış.
1. Cache Model Tanımlama
@HiveType(typeId: 0)
class MatchCache extends HiveObject {
@HiveField(0)
final String matchId;
@HiveField(1)
final List<double> predictions;
@HiveField(2)
final DateTime cachedAt;
@HiveField(3)
final int version;
bool get isExpired =>
DateTime.now().difference(cachedAt).inHours > 2;
}
2. Cache-First Strateji
class MatchRepository {
final Box<MatchCache> _cache;
final ApiClient _api;
Future<MatchData> getMatch(String id) async {
// 1. Cache'e bak
final cached = _cache.get(id);
if (cached != null && !cached.isExpired) {
return MatchData.fromCache(cached);
}
// 2. API'den çek
final data = await _api.fetchMatch(id);
// 3. Cache'e yaz (arka planda)
_cache.put(id, MatchCache(
matchId: id,
predictions: data.predictions,
cachedAt: DateTime.now(),
version: data.version,
));
return data;
}
}
3. Batch Pre-loading
Kullanıcı ana sayfaya girdiğinde, arka planda en olası maç verilerini önceden yüklüyoruz:
Future<void> preloadUpcomingMatches() async {
final upcoming = await _api.getUpcomingMatchIds();
await Future.wait(
upcoming.take(10).map((id) => getMatch(id)),
);
}
Sonuçlar
| Metrik | Önce | Sonra | |--------|------|-------| | İlk yükleme | 14s | 0.3s | | Sayfa geçişi | 3-5s | Anlık | | Veri boyutu | 500KB/istek | Cache'den | | API çağrısı | Her seferinde | 2 saatte 1 |
%97 performans artışı — kullanıcılar artık veriyi anlık görüyor.
Öğrenilen Dersler
- Hive'ın
LazyBoxözelliği büyük veri setleri için harika - Cache invalidation stratejisi kritik — stale data göstermemek lazım
compute()ile arka plan thread'de JSON parse etmek UI freeze'i önlüyor