---
title: Önbellekleme
description: >-
  Gitupcms'in içerik veritabanı olmadan GitHub çağrılarını nasıl az tuttuğu ve
  GitHub'ın istek sınırına ulaşıldığında ne olduğu.
---
Gitupcms'in içerik veritabanı yoktur. İçeriğinizin tek kopyası GitHub'daki deponuzdur. Bu yüzden eşitlenecek bir şey de, eskiyecek bir şey de yoktur. Aşağıdaki önbellekler yalnızca GitHub isteklerinden tasarruf sağlar. Her biri, hiçbir zaman eski içerik sunamayacak şekilde anahtarlanır.

## Neler önbelleğe alınır [#what-is-cached]

| Katman | Nerede | Anahtarı | Eskir mi? |
|---|---|---|---|
| Dosya ağacı | — | Her istekte tek bir özyinelemeli ağaç çağrısı | Asla: her seferinde yeniden okunur |
| Dosya metni | SQLite `blob_cache` | Git blob sha | Asla: değişen bir dosyanın sha'sı da değişir |
| Algılanan şema | Bellek | Ağaç sha'sı | Asla: değişen bir deponun ağaç sha'sı da değişir |
| Medya tarihleri | SQLite `media_date` | Blob sha | Asla |
| GitHub GET yanıtları | Bellek, sunucu başına 500 kayıt | Token + URL, ETag ile birlikte | Asla: GitHub her birini doğrular |

### Dosya ağacı ve dosya metni [#file-tree-and-file-text]

Her sayfa yüklemesinde dalın tüm dosya ağacı tek bir çağrıyla okunur. Ardından dosya içerikleri GraphQL üzerinden toplu olarak okunur, ama yalnızca henüz önbellekte olmayan blob'lar için. Blob sha'sı dosya içeriğinin hash'i olduğundan, düzenlenen bir dosya yeni bir sha alır ve yeniden okunur. Değişmeyen bir dosya ise asla iki kez okunmaz.

### Koşullu istekler (ETag) [#conditional-requests-etag]

Her GitHub GET isteği, son yanıtının ETag değeriyle birlikte gönderilir. Hiçbir şey değişmediyse GitHub `304 Not Modified` yanıtını döner ve **304 yanıtları istek sınırından düşülmez**. Gitupcms de elindeki yanıtı yeniden kullanır.

- Özel depolar ve izinler kullanıcıdan kullanıcıya değiştiği için yanıtlar her token için ayrı saklanır (token'ın kendisi değil, hash'i tutulur).
- Önbellek bellekte durur ve en son 500 yanıtı tutar. Yeniden başlatma önbelleği boşaltır, bu yüzden yeniden başlatmadan sonraki ilk istekler yine istek sınırından düşer.

## İstek sınırına ulaşıldığında [#when-the-rate-limit-is-reached]

GitHub, kullanıcı başına saatte 5.000 isteğe izin verir. Bir kullanıcı bu sınıra ulaşırsa CMS genel bir hata yerine, sınırın sıfırlanacağı saati de içeren *"GitHub's request limit was reached. Try again after HH:MM UTC."* mesajını gösterir.

## Bilerek önbelleğe alınmayanlar [#what-is-not-cached-on-purpose]

- **Süreye dayalı önbellek (TTL) yok.** N dakika sonra süresi dolan bir önbellek yanıtı, GitHub'da bir dakika önce değişmiş içeriği eski hâliyle gösterebilir. Yukarıdaki önbelleklerin her biri ya GitHub'a doğrulatılır ya da içeriğe göre anahtarlanır. Böylece CMS dışında yapılan bir commit bir sonraki sayfa yüklemesinde görünür.
- **Webhook yok.** Geçersiz kılınması gereken bir şey olmadığı için GitHub App ya da webhook kurmanız gerekmez.

SQLite veritabanı (`DB_PATH`, WAL modu) hesapları, çalışma alanlarını, ayarları ve yorumları tutar, ama sayfa içeriğini asla tutmaz. `blob_cache` ve `media_date` tablolarını temizlemek güvenlidir, çünkü bu tablolar kendiliğinden yeniden dolar.
