Cache Invalidation

Cache invalidation is the process of removing all cached items related to a change in the state of your model. The most basic kind of invalidation is direct item deletion. But when the state of a primary resource has spread across several cached items, keeping them in sync can be difficult.

キャッシュの無効化は、モデルの状態の変更に関連するキャッシュされたすべてのアイテムを削除するプロセスです。無効化の最も基本的な種類は、直接アイテムの削除です。しかし、プライマリ リソースの状態が複数のキャッシュされたアイテムにまたがっている場合、それらの同期を維持することは困難な場合があります。

The Symfony Cache component provides two mechanisms to help solve this problem:

Symfony キャッシュ コンポーネントは、この問題の解決に役立つ 2 つのメカニズムを提供します。
  • Tags-based invalidation for managing data dependencies;
    データの依存関係を管理するためのタグベースの無効化。
  • Expiration based invalidation for time-related dependencies.
    時間関連の依存関係の有効期限に基づく無効化。

Using Cache Tags

To benefit from tags-based invalidation, you need to attach the proper tags to each cached item. Each tag is a plain string identifier that you can use at any time to trigger the removal of all items associated with this tag.

タグベースの無効化を利用するには、キャッシュされた各アイテムに適切なタグを添付する必要があります。各タグは、このタグに関連付けられたすべてのアイテムの削除をトリガーするためにいつでも使用できるプレーン文字列の識別子です。

To attach tags to cached items, you need to use the tag() method that is implemented by cache items:

キャッシュされたアイテムにタグを付けるには、キャッシュ アイテムによって実装される tag() メソッドを使用する必要があります。
1
2
3
4
5
6
7
8
$item = $cache->get('cache_key', function (ItemInterface $item) {
    // [...]
    // add one or more tags
    $item->tag('tag_1');
    $item->tag(['tag_2', 'tag_3']);

    return $cachedValue;
});

If $cache implements TagAwareCacheInterface, you can invalidate the cached items by calling invalidateTags():

$cache が TagAwareCacheInterface を実装している場合、invalidateTags() を呼び出してキャッシュされたアイテムを無効にすることができます。
1
2
3
4
5
// invalidate all items related to `tag_1` or `tag_3`
$cache->invalidateTags(['tag_1', 'tag_3']);

// if you know the cache key, you can also delete the item directly
$cache->delete('cache_key');

Using tag invalidation is very useful when tracking cache keys becomes difficult.

タグ無効化の使用は、キャッシュ キーの追跡が困難になった場合に非常に役立ちます。

Tag Aware Adapters

To store tags, you need to wrap a cache adapter with the TagAwareAdapter class or implement TagAwareCacheInterface and its invalidateTags() method.

タグを保存するには、TagAwareAdapter クラスでキャッシュ アダプターをラップするか、TagAwareCacheInterface とその invalidateTags() メソッドを実装する必要があります。

Note

ノート

When using a Redis backend, consider using RedisTagAwareAdapter which is optimized for this purpose. When using filesystem, likewise consider to use FilesystemTagAwareAdapter.

Redis バックエンドを使用する場合は、この目的に最適化された RedisTagAwareAdapter の使用を検討してください。ファイルシステムを使用する場合は、同様に FilesystemTagAwareAdapter を使用することを検討してください。

The TagAwareAdapter class implements instantaneous invalidation (time complexity is O(N) where N is the number of invalidated tags). It needs one or two cache adapters: the first required one is used to store cached items; the second optional one is used to store tags and their invalidation version number (conceptually similar to their latest invalidation date). When only one adapter is used, items and tags are all stored in the same place. By using two adapters, you can e.g. store some big cached items on the filesystem or in the database and keep tags in a Redis database to sync all your fronts and have very fast invalidation checks:

TagAwareAdapter クラスは、即時の無効化を実装します (時間の複雑さは O(N) で、N は無効化されたタグの数です)。 1 つまたは 2 つのキャッシュ アダプターが必要です。最初に必要なものは、キャッシュされたアイテムの格納に使用されます。 2 番目のオプションは、タグとその無効化バージョン番号 (概念的には最新の無効化日付に似ています) を格納するために使用されます。アダプタを 1 つだけ使用すると、アイテムとタグがすべて同じ場所に格納されます。 2 つのアダプターを使用することで、たとえば、次のことができます。ファイルシステムまたはデータベースにキャッシュされたいくつかの大きなアイテムを保存し、Redis データベースにタグを保持して、すべてのフロントを同期し、非常に高速な無効化チェックを行います。
1
2
3
4
5
6
7
8
9
10
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\Adapter\TagAwareAdapter;

$cache = new TagAwareAdapter(
    // Adapter for cached items
    new FilesystemAdapter(),
    // Adapter for tags
    new RedisAdapter('redis://localhost')
);

Note

ノート

TagAwareAdapter implements PruneableInterface, enabling manual pruning of expired cache entries by calling its prune() method (assuming the wrapped adapter itself implements PruneableInterface).

TagAwareAdapter は PruneableInterface を実装し、その prune() メソッドを呼び出すことにより、期限切れのキャッシュ エントリの手動プルーニングを有効にします (ラップされたアダプター自体が PruneableInterface を実装すると仮定します)。

Using Cache Expiration

If your data is valid only for a limited period of time, you can specify their lifetime or their expiration date with the PSR-6 interface, as explained in the Cache Items article.

データが限られた期間のみ有効である場合は、キャッシュ アイテムの記事で説明されているように、PSR-6 インターフェースを使用して有効期間または有効期限を指定できます。