
# Önbelleğe Alma

Queuety; kuyruk duraklatma denetimleri, hız sınırı sayaçları, iş akışı durumu aramaları ve kilit işlemleri gibi sık kullanılan yollardaki veritabanı sorgularını azaltan bir önbellek katmanı içerir. `Queuety::init()` çağrıldığında önbellek otomatik olarak başlatılır.

## Önbellek arayüzü

Tüm önbellek arka uçları `Queuety\Contracts\Cache` uygular:

| Yöntem | Döndürdüğü | Açıklama |
|---|---|---|
| `get( string $key )` | `mixed` | Bir değeri alır. Bulunamaz veya süresi dolmuşsa `null` döndürür. |
| `set( string $key, mixed $value, int $ttl = 0 )` | `void` | Bir değeri saklar. TTL değerinin 0 olması, sürenin dolmayacağı anlamına gelir. |
| `delete( string $key )` | `void` | Bir değeri kaldırır. |
| `has( string $key )` | `bool` | Bir anahtarın mevcut ve süresi dolmamış olup olmadığını denetler. |
| `add( string $key, mixed $value, int $ttl = 0 )` | `bool` | Bir değeri yalnızca anahtar henüz yoksa ayarlar (atomik). Değer ayarlandıysa `true` döndürür. |
| `flush()` | `void` | Önbellekteki tüm öğeleri kaldırır. `ApcuCache::flush()`, yalnızca Queuety öğelerini değil, sunucudaki tüm APCu girdilerini temizleyen `apcu_clear_cache()` çağrısını yapar. |

## Yerleşik arka uçlar

### MemoryCache (varsayılan)

`Queuety\Cache\MemoryCache`, dizi tabanlı ve süreç başına çalışan bir önbellektir. Öğeler bir PHP dizisinde saklanır ve süreç sona erdiğinde kaybolur. APCu kullanılamıyorsa varsayılan arka uç budur.

Hiçbir uzantı gerektirmez, tek çalışanlı dağıtımlarda iyi çalışır ve her çalışan sürecini diğerlerinden yalıtır.

### ApcuCache

`Queuety\Cache\ApcuCache`, aynı sunucudaki tüm PHP süreçleri arasında paylaşılan bellek için APCu uzantısını kullanır. Diğer uygulamalarla çakışmayı önlemek için tüm anahtarlara otomatik olarak `queuety:` öneki eklenir.

Bu arka uç `php-apcu` uzantısını gerektirir, aynı sunucudaki çalışanlar arasında önbellek girdilerini paylaşır ve `apcu_add()` aracılığıyla `add()` işlemini gerçekten atomik hâle getirir.

## Otomatik algılama

`Queuety\Cache\CacheFactory` kullanılabilir en iyi arka ucu otomatik olarak seçer:

`apcu_store()` varsa ve `apcu_enabled()`, `true` döndürüyorsa Queuety, `ApcuCache` kullanır. Aksi durumda `MemoryCache` seçeneğine geri döner. Bu işlem `Queuety::init()` içinde gerçekleştiğinden varsayılan davranış için ek yapılandırma gerekmez.

## Neler önbelleğe alınır

Önbellek katmanı çeşitli alt sistemler tarafından dahili olarak kullanılır:

| Veri | Amaç |
|---|---|
| Kuyruk duraklatma durumu | Her çalışan döngüsü yinelemesinde veritabanı sorgusu yapılmasını önler |
| Hız sınırı sayaçları | Yürütme sayılarını veritabanı yerine bellekte izler |
| İş akışı durumu | Çok adımlı iş akışının ilerlemesi sırasında okumaları azaltır |
| Kilit durumu | Benzersiz işler ve mutex ara yazılımı için kilit varlığı denetimlerini hızlandırır |

## TTL yapılandırması

Varsayılan önbellek TTL değeri 5 saniyedir. Kuyruk duraklatma durumu ve hız sınırı sayaçları için geçerlidir; iş akışı durumu ve durum okumaları ise sabit 2 saniye boyunca önbelleğe alınır ve bu süre sabitle değiştirilemez. Varsayılanı `wp-config.php` dosyanızdaki `QUEUETY_CACHE_TTL` sabitiyle geçersiz kılın:

```php
define( 'QUEUETY_CACHE_TTL', 10 ); // 10 seconds
```

Daha düşük bir TTL, daha sık veritabanı sorgusu yapılması ancak verilerin daha güncel olması demektir. Daha yüksek bir TTL veritabanı yükünü azaltır, ancak verilerin güncelliğini yitirmesine yol açar. Çoğu dağıtım için varsayılan 5 saniye iyi bir dengedir.

## Özel önbellek arka ucu

Özel bir önbellek arka ucu (Redis, Memcached veya başka bir şey) kullanmak için `Contracts\Cache` arayüzünü uygulayın ve `Queuety::init()` öncesinde `Queuety::set_cache()` çağırın:

```php
use Queuety\Contracts\Cache;
use Queuety\Queuety;

class RedisCache implements Cache {
    public function get( string $key ): mixed { /* ... */ }
    public function set( string $key, mixed $value, int $ttl = 0 ): void { /* ... */ }
    public function delete( string $key ): void { /* ... */ }
    public function has( string $key ): bool { /* ... */ }
    public function add( string $key, mixed $value, int $ttl = 0 ): bool { /* ... */ }
    public function flush(): void { /* ... */ }
}

// Set the cache before init() so all subsystems use it.
Queuety::set_cache( new RedisCache() );
Queuety::init( $connection );
```

`init()` öncesinde `set_cache()` çağrılırsa fabrika otomatik algılaması tamamen atlanır ve özel arka ucunuz kullanılır.

## Önbelleğe erişme

Etkin önbellek örneğini istediğiniz zaman alın:

```php
$cache = Queuety::cache();

$cache->set( 'my_key', 'my_value', 60 );
$value = $cache->get( 'my_key' );
```

Bu, o anda etkin olan arka ucu (MemoryCache, ApcuCache veya özel uygulamanız) döndürür.
