1. Introduction¶
The SonataCacheBundle
provides some facilities to store computed data into a cache backend. Unlike other cache solutions, the SonataCacheBundle
does not use a string as the name for the cache entry.
The name is an array and it is up to the backend solution to compute the best key. On top of that, a cache entry can also have some optional metadata that can be stored along by the cache backend.
- So a cache entry is named
CacheElement
and has a few fields: - ttl: the Time To Live field
- keys: the information to generate the final key
- data: the computed data
- createdAt: the creation date
- contextualKeys: the array containing some extra metadata
1.1. Usage Sample¶
Let’s say you are rendering a blog post that can have many authors and be related to an image. So, you have many information:
- post_id: integer
- author_ids: array
- image_id: integer
- action: view (we are rendering a blog post)
So with the SonataCacheBundle
, you will have:
keys=['post_id' => 1, 'action' => 'view']
: because it is the main information in your exampledata=raw html
: the html rendered by the viewcontextualKeys: ['post_id' => 1, 'author_ids' => [1, 2, ...], 'image_id' => 2, 'action' => 'view']
: the contextual keys can contain any information, so we include all information.
Now, let’s see how this cache element will be used with 2 backends, memcached and mongodb (capped collection):
- The memcached adapter will generate a hash from the
keys
value, and will not used thecontextualKeys
information as there is no way to use those values with memcached.- The mongodb adapter will store the value as is, mongodb supports array! also the
contextualKeys
will be stored.
Now, let’s try to remove a cache element. This has to be done using the flush
method. The method accepts an array as key to the element to remove (remember, keys are arrays not strings). If you call the function with ['post_id' => 1, 'action' => 'view']
the method will
delete the previous cache entry.
This will work on all adapters as the array is the main key of the CacheElement
. Let’s see how to push this a bit further with the mongodb adapter.
You might want to remove all cache entries when the blog post is saved or when the related image is updated. This can actually be done quite easily. Just call flush
:
// this will flush all entries in the mongodb collection matching this criteria
$adapter->flush(['post_id' => 1]);
// this will flush all entries included the post cache as the image_id is part of the contextualKeys element
$adapter->flush(['image_id' => 1]);
As you can see, the memcached
driver is quite limited as you can retrieve an element but you cannot do much with invalidation.