概要
こんにちは!秋霜堂 石川です。
キャッシュ戦略を見直すことで、アプリケーションのパフォーマンスを維持しながらインフラコストを削減できることがあります。特に、頻繁にアクセスされないデータに対してRedisのようなインメモリキャッシュを使用するのは正直過剰です。今回は代替手段としてSymfony/Cacheコンポーネントを活用してインフラコストを削減することにしました。
Redisキャッシュの非効率性
多くのWebアプリケーションではパフォーマンス向上のためにRedisをキャッシュとして利用しています。確かにRedisは高速で信頼性の高いキャッシュソリューションですが、頻繁にアクセスされないデータや低トラフィックのアプリケーションにとっては、専用のRedisサーバーやクラスタを維持するコストは無駄になります。
今回、対象となったアプリケーションでは以前よりRedisが使われていたのですが、アクセス頻度の高いデータの格納が不要になったため宝の持ち腐れ状態でした。
アクセス頻度の低いデータに対してはRedisのようなインメモリキャッシュを使用するのではなく、ファイルシステムベースのキャッシュを利用することでインフラコストを削減できると考えました。今回はSymfony/Cacheコンポーネントを使います。
Symfony/Cacheとは
Symfony/Cacheは、PHPフレームワークSymfonyのコンポーネントの一つで、単純なキャッシュニーズから高度なキャッシュニーズまでカバーする機能を提供しています。このコンポーネントは、PSR-6(PHPキャッシュインターフェース標準)に準拠しており、様々なキャッシュバックエンドをサポートしています。
https://symfony.com/doc/current/cache.html
Symfony/Cacheの大きな特徴は、ファイルシステム、APCu、Memcached、Redis、データベースなど、多様なストレージバックエンドに対応したアダプターを提供していることです。デフォルトはファイルキャッシュですが、設定を変更することで柔軟に変更できます。
https://symfony.com/doc/current/components/cache.html#available-cache-adapters
Redisへのアクセスは別の方法を使っていたため、Symfony/Cacheの導入から行いました。
Symfony/Cacheのインストール
たいていのSymfonyプロジェクトではcomposer.lockに入っていますが、直接依存することになるので入れておきます。
$ composer require symfony/cache
Symfony/Cacheの使い方
使い方は非常にシンプルです。今回はFilesystemAdapterインスタンスを手動で生成するのではなく、DIを使って注入します。
use Symfony\Contracts\Cache\CacheInterface;
public function __construct(
private readonly CacheInterface $cache,
) {
}
次に、キャッシュの取得と保存を行いますが、Symfony/Cacheではget()
メソッドを使用してキャッシュの取得と保存を一度に行います。
public function hoge(): void
{
// ...
$value = $this->cache->get('my_cache_key', function (ItemInterface $item) use ($kid) {
// ここでreturnした値が、cacheが存在しないときにcacheされたうえで使われる
if (isUseCache) {
// nullを返すときはcacheされない
return null;
}
if (hasExpires) {
// 有効期限を設定することもできる
$item->expiresAfter(3600);
}
return 'cacheする値'
});
// ...
}
キャッシュを削除する場合は、delete()
メソッドを使用します。
$cache->delete('my_cache_key');
まとめ
頻繁にアクセスされないデータのキャッシュをRedisからSymfony/Cacheのファイルシステムベースのキャッシュに移行ですが、以上のようにあっさりと対応することができました。専用のRedisサーバーやクラスタを維持するコストを削減しながら、アプリケーションのパフォーマンスは維持されています。
Symfony/Cacheの柔軟性と拡張性により、将来的にアプリケーションの要件が変化した場合でも、キャッシュバックエンドを簡単に切り替えることができます。また、PSR-6に準拠しているため、他のPSR-6互換のキャッシュライブラリとも互換性があります。
万一、redisを使う必要性が再度出てきたとしても今度はSymfony/Cacheの接続先を変更するだけですので。
秋霜堂株式会社はWebを中心としたソフトウェア開発企業です。エンジニアとして案件を探している方 / 発注先を探している方など、少しでも気になった方はぜひお問い合わせください!
https://syusodo.co.jp