コンテンツへスキップ

キャッシュ

Queuetyには、キューの一時停止確認、レート制限カウンター、ワークフロー状態の参照、ロック操作など、頻繁に実行される処理でデータベースクエリを減らすキャッシュ層が含まれています。Queuety::init()を呼び出すと、キャッシュは自動的に初期化されます。

キャッシュインターフェース

すべてのキャッシュバックエンドはQueuety\Contracts\Cacheを実装します:

メソッド 戻り値 説明
get( string $key ) mixed 値を取得します。見つからない場合や期限切れの場合はnullを返します。
set( string $key, mixed $value, int $ttl = 0 ) void 値を保存します。TTLが0の場合、期限切れになりません。
delete( string $key ) void 値を削除します。
has( string $key ) bool キーが存在し、期限切れでないかを確認します。
add( string $key, mixed $value, int $ttl = 0 ) bool キーがまだ存在しない場合にのみ値を設定します(アトミック)。値が設定された場合はtrueを返します。
flush() void キャッシュ内のすべての項目を削除します。ApcuCache::flush()はapcu_clear_cache()を呼び出し、Queuetyのものだけでなく、サーバー上のすべてのAPCuエントリーを消去します。

組み込みバックエンド

MemoryCache(デフォルト)

Queuety\Cache\MemoryCacheは、プロセスごとの配列ベースのキャッシュです。項目はPHP配列に保存され、プロセスの終了時に失われます。APCuを利用できない場合のデフォルトバックエンドです。

拡張機能は不要で、単一ワーカーのデプロイに適しており、各ワーカープロセスは他のプロセスから分離されます。

ApcuCache

Queuety\Cache\ApcuCacheはAPCu拡張機能を使い、同じサーバー上のすべてのPHPプロセス間で共有メモリーを利用します。他のアプリケーションとの衝突を防ぐため、すべてのキーにはqueuety:が自動的に付加されます。

このバックエンドにはphp-apcu拡張機能が必要です。同じサーバー上のワーカー間でキャッシュエントリーを共有し、add()をapcu_add()経由で真にアトミックにします。

自動検出

Queuety\Cache\CacheFactoryは、利用可能な最適なバックエンドを自動的に選択します:

apcu_store()が存在し、apcu_enabled()がtrueを返す場合、QueuetyはApcuCacheを使用します。それ以外の場合はMemoryCacheにフォールバックします。これはQueuety::init()内で行われるため、デフォルトの動作に追加設定は不要です。

キャッシュ対象

キャッシュ層は、複数のサブシステムで内部的に使用されます:

データ 用途
キューの一時停止状態 ワーカーのループごとにデータベースへ問い合わせるのを防ぎます
レート制限カウンター 実行回数をデータベースではなくメモリーで追跡します
ワークフロー状態 複数ステップのワークフロー進行中の読み取りを減らします
ロック状態 一意のジョブとミューテックスミドルウェアでロックの有無を素早く確認できます

TTLの設定

デフォルトのキャッシュTTLは5秒です。キューの一時停止状態とレート制限カウンターに適用されます。ワークフローのステータスと状態の読み取りは固定の2秒間キャッシュされ、この時間は定数で変更できません。デフォルト値を変更するには、wp-config.php内のQUEUETY_CACHE_TTL定数を設定します:

PHP
define( 'QUEUETY_CACHE_TTL', 10 ); // 10 seconds

TTLを短くするとデータベースへの問い合わせが増えますが、データは最新に保たれます。TTLを長くするとデータベースの負荷は減りますが、データの古さが増します。ほとんどのデプロイでは、デフォルトの5秒が適切なバランスです。

カスタムキャッシュバックエンド

カスタムのキャッシュバックエンド(Redis、Memcachedなど)を使うには、Contracts\Cacheインターフェースを実装し、Queuety::init()より前にQueuety::set_cache()を呼び出します:

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 );

set_cache()をinit()より前に呼び出すと、ファクトリーによる自動検出は完全にスキップされ、カスタムバックエンドが使用されます。

キャッシュへのアクセス

いつでもアクティブなキャッシュインスタンスを取得できます:

PHP
$cache = Queuety::cache();

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

現在アクティブなバックエンド(MemoryCache、ApcuCache、またはカスタム実装)が返されます。