Skip to content

Commit 0ffc261

Browse files
[Cache] Add chapter about invalidation, tags, etc.
1 parent b97d442 commit 0ffc261

File tree

4 files changed

+125
-8
lines changed

4 files changed

+125
-8
lines changed

components/cache.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
The Cache Component
77
===================
88

9-
The Cache component provides a strict `PSR-6`_ implementation for adding
9+
The Cache component provides an extended `PSR-6`_ implementation for adding
1010
cache to your applications. It is designed to have a low overhead and it
1111
ships with ready to use adapters for the most common caching backends.
1212

@@ -42,7 +42,7 @@ meaning of some key concepts:
4242
Basic Usage
4343
-----------
4444

45-
This component is a strict implementation of `PSR-6`_, which means that the API
45+
This component is an implementation of `PSR-6`_, which means that its basic API
4646
is the same as defined in the standard. Before starting to cache information,
4747
create the cache pool using any of the built-in adapters. For example, to create
4848
a filesystem-based cache, instantiate :class:`Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter`::
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
.. index::
2+
single: Cache; Invalidation
3+
single: Cache; Tags
4+
5+
Cache Invalidation
6+
==================
7+
8+
Cache invalidation is the process of removing all cached items related to a
9+
change in the state of your model. The most basic kind of invalidation is direct
10+
items deletion. But when the state of a primary resource has spread accross
11+
several cached items, keeping them in sync can be difficult.
12+
13+
The Symfony Cache component provides two mechanisms to help solve this problem:
14+
15+
* Tags based invalidation for managing data dependencies;
16+
* Expiration based invalidation for time related dependencies.
17+
18+
.. versionadded:: 3.2
19+
Tags based invalidation was introduced in Symfony 3.2.
20+
21+
Using Cache Tags
22+
----------------
23+
24+
To benefit from tags based invalidation, you need to attach the proper tags to
25+
each cached items. Each tag is a plain string identifier that you can use at any
26+
time to trigger the removal of all items that had this tag attached to them.
27+
28+
To attach tags to cached items, you need to use the
29+
:method:`Symfony\\Component\\Cache\\CacheItem::tag` method that is implemented by
30+
cache items, as returned by cache adapters::
31+
32+
$item = $cache->getItem('cache_key');
33+
// ...
34+
// add one or more tags
35+
$item->tag('tag_1');
36+
$item->tag(array('tag_2', 'tag_3'));
37+
$cache->save($item);
38+
39+
If ``$cache`` implements :class:`Symfony\\Component\\Cache\\TagAwareAdapterInterface`,
40+
you can invalidate the cached items by calling
41+
:method:`Symfony\\Component\\Cache\\TagAwareAdapterInterface::invalidateTags`::
42+
43+
// invalidate all items related to `tag_2`
44+
$cache->invalidateTags('tag_2');
45+
46+
// or invalidate all items related to `tag_1` or `tag_3`
47+
$cache->invalidateTags(array('tag_1', 'tag_3'));
48+
49+
// if you know the cache key, you can of course delete directly
50+
$cache->deleteItem('cache_key');
51+
52+
Using tags invalidation is very useful when tracking cache keys becomes difficult.
53+
54+
Tag Aware Adapters
55+
~~~~~~~~~~~~~~~~~~
56+
57+
To store tags, you need to wrap a cache adapter with the
58+
:class:`Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter` class or implement
59+
:class:`Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface` and its only
60+
:method:`Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface::invalidateTags`
61+
method.
62+
63+
The :class:`Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter` class implements
64+
instantaneous invalidation (time complexity is ``O(N)`` where ``N`` is the number
65+
of invalidated tags). It needs one or two cache adapters: the first required
66+
one is used to store cached items; the second optional one is used to store tags
67+
and their invalidation version number (conceptually similar to their latest
68+
invalidation date). When only one adapter is used, items and tags are all stored
69+
in the same place. By using two adapters, you can e.g. store some big cached items
70+
on the filesystem or in the database and keep tags in a Redis database to sync all
71+
your fronts and have very fast invalidation checks::
72+
73+
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
74+
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
75+
use Symfony\Component\Cache\Adapter\RedisAdapter;
76+
77+
$cache = new TagAwareAdapter(
78+
// Adapter for cached items
79+
new FilesystemAdapter(),
80+
// Adapter for tags
81+
new RedisAdapter('redis://localhost')
82+
);
83+
84+
Using Cache Expiration
85+
----------------------
86+
87+
If your data is valid only for a limited period of time, you can specify their
88+
lifetime or their expiration date with the PSR-6 interface, as explained in the
89+
:doc:`/components/cache/cache_items` article.

components/cache/cache_items.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ In the Cache component they are represented by the
1313
Cache Item Keys and Values
1414
--------------------------
1515

16-
The **key** of a cache item is a UTF-8 encoded string which acts as its
16+
The **key** of a cache item is a plain string which acts as its
1717
identifier, so it must be unique for each cache pool. You can freely choose the
1818
keys, but they should only contain letters (A-Z, a-z), numbers (0-9) and the
1919
``_`` and ``.`` symbols. Other common symbols (such as ``{``, ``}``, ``(``,

components/cache/cache_pools.rst

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
single: APC Cache, APCu Cache
44
single: Doctrine Cache
55
single: Redis Cache
6+
single: PDO Cache, Doctrine DBAL Cache
67

78
Cache Pools
89
===========
@@ -41,7 +42,7 @@ Filesystem Cache Adapter
4142
~~~~~~~~~~~~~~~~~~~~~~~~
4243

4344
This adapter is useful when you want to improve the application performance but
44-
can't install tools like APC or Redis in the server. This adapter stores the
45+
can't install tools like APCu or Redis in the server. This adapter stores the
4546
contents as regular files in a set of directories on the local file system::
4647

4748
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
@@ -83,7 +84,7 @@ degrade performance significantly::
8384
Redis Cache Adapter
8485
~~~~~~~~~~~~~~~~~~~
8586

86-
This adapter stores the contents in the memory of the server. Unlike the APCu
87+
This adapter stores the contents in the memory of a Redis server. Unlike the APCu
8788
adapter, it's not limited to the shared memory of the current server, so you can
8889
store contents in a cluster of servers if needed.
8990

@@ -102,6 +103,36 @@ the ``\Redis``, ``\RedisArray``, ``\RedisCluster`` or ``\Predis`` classes::
102103
$defaultLifetime = 0
103104
);
104105

106+
The :method:`Symfony\\Component\\Cache\\Adapter\\RedisAdapter::createConnection`
107+
helper allows creating a connection to a Redis server using a DSN configuration::
108+
109+
$redisConnection = RedisAdapter::createConnection('redis://localhost');
110+
111+
See the method's docblock for more options.
112+
113+
PDO & Doctrine DBAL Cache Adapter
114+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
115+
116+
This adapter stores the cached items a SQL database accessed through a PDO or a
117+
Doctrine DBAL connection::
118+
119+
use Symfony\Component\Cache\Adapter\PdoAdapter;
120+
121+
$cache = new PdoAdapter(
122+
// a PDO, a Doctrine DBAL connection or DSN for lazy connecting through PDO
123+
$databaseConnectionOrDSN,
124+
// the string prefixed to the keys of the items stored in this cache
125+
$namespace = '',
126+
// in seconds; applied to cache items that don't define their own lifetime
127+
// 0 means to store the cache items indefinitely (i.e. until the database is cleared)
128+
$defaultLifetime = 0,
129+
// an array of options for configuring the database connection
130+
$options = array()
131+
);
132+
133+
.. versionadded:: 3.2
134+
The PDO & Doctrine DBAL adapter was introduced in Symfony 3.2.
135+
105136
Chain Cache Adapter
106137
~~~~~~~~~~~~~~~~~~~
107138

@@ -141,9 +172,6 @@ that external cache and save them in the Symfony cache of your application::
141172
The adapter accepts two additional optional arguments: the namespace (``''`` by
142173
default) and the default lifetime (``0`` by default).
143174

144-
Another use case for this adapter is to get statistics and metrics about the
145-
cache hits (``getHits()``) and misses (``getMisses()``).
146-
147175
Doctrine Cache Adapter
148176
~~~~~~~~~~~~~~~~~~~~~~
149177

0 commit comments

Comments
 (0)