Önbellekleme
Statigo, optimal performans için iki katmanlı önbellekleme sistemi sunar: bellek içi önbellekleme ve disk kalıcılığı.
Mimari
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ İstek │────▶│ Bellek Önbellek│────▶│Disk Önbellek│
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ Brotli │
│ Sıkıştırılmış│
└─────────────┘
Önbellek Stratejileri
Her rota farklı bir önbellekleme stratejisine sahip olabilir:
| Strateji | Açıklama | Kullanım Durumu |
|---|---|---|
immutable | Asla sona ermez | Statik varlıklar, sürümlü dosyalar |
static | Uzun önbellek, eski işaretlendiğinde yeniden doğrular | Nadiren değişen sayfalar |
incremental | 24 saat sonra otomatik yeniden doğrular | Blog gönderileri, makaleler |
dynamic | Her zaman eski olduğunda yeniden doğrular | Kullanıcıya özgü içerik |
config/routes.json içinde tanımlayın:
{
"canonical": "/",
"paths": {"en": "/en"},
"strategy": "static",
"template": "index.html",
"handler": "index"
}
Başlatma
import "statigo/framework/cache"
cacheManager, err := cache.NewManager("data/cache", logger)
if err != nil {
log.Fatal(err)
}
Önbellek Ara Yazılımı
r.Use(middleware.CacheMiddleware(cacheManager, logger))
Ara yazılım otomatik olarak:
- Mevcut yanıt için bellek önbelleğini kontrol eder
- Bellek isabeti yoksa disk önbelleğini kontrol eder
- Her ikisi de isabet yoksa işleyiciyi çalıştırır
- Yanıtı her iki katmana da depolar
Önceden Oluşturma
Tüm sayfaları başlangıçta oluşturun:
# Uygulamayı derle
go build -o statigo
# Tüm sayfaları önceden oluştur
./statigo prerender
Veya programatik olarak:
cacheManager.RebuildAll(r, appLogger)
Önbellek Geçersiz Kılma
Manuel Geçersiz Kılma
Bir rotayı eski olarak işaretleyin:
cacheManager.MarkStale("/en/about")
Webhook Geçersiz Kılma
Webhook uç noktasını yapılandırın:
r.Post("/cache/webhook", middleware.WebhookInvalidate(
cacheManager,
os.Getenv("WEBHOOK_SECRET"), // Ortam değişkeninden
logger,
))
Webhook gönderin:
curl -X POST http://localhost:8080/cache/webhook \
-H "X-Webhook-Secret: your-secret-key" \
-H "Content-Type: application/json" \
-d '{"canonical": "/about"}'
Strateji Tabanlı Geçersiz Kılma
Stratejiye göre yeniden oluşturun:
// Tüm statik sayfaları yeniden oluştur
cacheManager.RebuildByStrategy("static", r, logger)
// Belirli bir rotayı yeniden oluştur
cacheManager.RebuildByCanonical("/about", r, logger)
Önbellek Depolama
Bellek Önbelleği
- Eşzamanlı erişim için
sync.Mapiçinde depolanır - Brotli ile sıkıştırılır
- Otomatik ETag oluşturma
Disk Önbelleği
data/cache/dizininde depolanır- Kanonik yolun SHA256 hash'i ile adlandırılır
- Uygulama yeniden başlatmalarından sonra hayatta kalır
ETag Desteği
Statigo önbellek girdileri için otomatik olarak ETag'ler oluşturur:
ETag: "a1b2c3d4e5f6..."
If-None-Match başlığına sahip istemciler 304 Not Modified yanıtları alır.
Yapılandırma
Ortam değişkenleri:
# Önbellek dizini
CACHE_DIR=./data/cache
# Önbellekleme devre dışı (test için)
DISABLE_CACHE=false
İzleme
Önbellek sağlığını kontrol edin:
stats := cacheManager.GetStats()
fmt.Printf("Bellek girdileri: %d\n", stats.MemoryEntries)
fmt.Printf("Disk girdileri: %d\n", stats.DiskEntries)
En İyi Uygulamalar
Gerçekten statik içerik için
immutablekullanın- Sürüm hash'li varlıklar:
/style.v1.css - Belge sayfaları
- Sürüm hash'li varlıklar:
Nadiren değişen sayfalar için
statickullanın- Ana sayfa
- Hakkında sayfaları
- Özellik sayfaları
İçerik sayfaları için
incrementalkullanın- Blog gönderileri
- Makaleler
- Haber öğeleri
Kişiselleştirilmiş içerik için
dynamickullanın- Kullanıcı panelleri
- Admin panelleri
- Hesap ayarları
Dağıtımdan sonra önceden oluşturun
go build -o app ./app prerender ./app serveWebhook geçersiz kılma ayarlayın
- CMS entegrasyonu için
- İçerik güncellemeleri için
- Otomatik dağıtımlar için