Nicolas Grekas
Contributed by Nicolas Grekas in #19047

In Symfony 3.1 we added a new Cache component that was a strict implementation of the PSR-6: Caching Interface standard. In Symfony 3.2 we decided to improve the cache with some features not defined by the standard.

The first new feature is the tag-based invalidation to create tagged caches. Imagine that your application is an e-commerce application that stores users' reviews in the cache. When saving those reviews, you can now associate tags to them:

1
2
3
4
5
6
7
8
9
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$cache = new FilesystemAdapter();

$review = $cache->getItem('reviews-'.$reviewId);
$review->set('...');
$review->tag(['reviews', 'products', 'product-'.$productId]);

$cache->save($review);

The cached review is associated with three different tags that can be used to invalidate related items:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// the HTML structure of reviews has changed:
// invalidate all reviews
$cache->invalidateTags('reviews');

// a special sale is enabled in the store:
// invalidate anything related to products
$cache->invalidateTags('products');

// the data of the product #123 has changed:
// invalidate anything related to that product
$cache->invalidateTags('product-123');

// a major store update is being deployed:
// invalidate all the information related to products and reviews
$cache->invalidateTags(['products', 'reviews']);

// after invalidating any of the previous tags, the item is no longer
// available in the cache:
$cache->getItem('reviews-'.$reviewId)->isHit();  // returns false

The Cache component now defines a TagAwareAdapterInterface to add tag-based invalidation to your own cache adapters and TaggedCacheItemInterface to allow tagging cache items. In addition, it includes a TagAwareRedisAdapter to enable tag-based invalidation when using Redis.

Published in #Living on the edge