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
CacheElementand 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 example
data=raw html: the html rendered by the view
contextualKeys: ['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
keysvalue, and will not used the
contextualKeysinformation 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
contextualKeyswill 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
// 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.