Slide 1

Slide 1 text

Symfony Cache a premium recipe to fast apps #Symfony_Live @nicolasgrekas

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

PSR-6 Caching Interface PHP-FIG – Dec. 2015 Symfony 3.1 – May 2016

Slide 4

Slide 4 text

#Symfony_Live @nicolasgrekas • A common interface caching needs o With normalized error handling • Allow for multiple independent extensions PSR-6 Goals

Slide 5

Slide 5 text

#Symfony_Live @nicolasgrekas • doctrine/cache 70M • symfony/cache 6.5M • zendframework/zend-cache 4.5M • illuminate/cache 3.6M • tedivm/stash 1.4M Cache on Packagist

Slide 6

Slide 6 text

#Symfony_Live @nicolasgrekas PSR-6 CacheItemPoolInterface

Slide 7

Slide 7 text

#Symfony_Live @nicolasgrekas PSR-6 CacheItemInterface

Slide 8

Slide 8 text

#Symfony_Live @nicolasgrekas PSR-6 Typical Lifecycle

Slide 9

Slide 9 text

Symfony Cache What else?

Slide 10

Slide 10 text

#Symfony_Live @nicolasgrekas • A dual PSR-6 and PSR-16 implementation • With strict public API and error handling • With exclusive extra features • Tuned for performance • Following Symfony’s quality processes Symfony Cache

Slide 11

Slide 11 text

#Symfony_Live @nicolasgrekas • Runtime Memory • Filesystem • PHP code – one file per item • PHP code – one file with all items • APCu Symfony Cache – Local backends

Slide 12

Slide 12 text

#Symfony_Live @nicolasgrekas • Redis • Memcached • PDO/DBAL Symfony Cache – Remote backends

Slide 13

Slide 13 text

#Symfony_Live @nicolasgrekas • Chain • Doctrine • Proxy • Null • SimpleCache • Traceable Symfony Cache – Special backends

Slide 14

Slide 14 text

#Symfony_Live @nicolasgrekas Doctrine 834.863 items/ms PHP Cache 313.334 items/ms Stash PHP 55.346 items/ms Symfony 533.366 items/ms Symfony Cache – APCu Bench

Slide 15

Slide 15 text

#Symfony_Live @nicolasgrekas Doctrine 705.001 items/ms PHP Cache 362.477 items/ms Stash PHP 153.803 items/ms Symfony 845.910 items/ms Symfony Cache – APCu Bench

Slide 16

Slide 16 text

#Symfony_Live @nicolasgrekas Doctrine 34.061 items/ms Symfony 478.910 items/ms Symfony Cache – Redis Bench

Slide 17

Slide 17 text

#Symfony_Live @nicolasgrekas • by expiration • by tags • by versioning Symfony Cache – Invalidation strategies

Slide 18

Slide 18 text

#Symfony_Live @nicolasgrekas • igbinary compatibility • MarshallerInterface • Multi-hosts DSN Symfony Cache – Extra 4.2 features

Slide 19

Slide 19 text

Symfony Framework Wiring

Slide 20

Slide 20 text

#Symfony_Live @nicolasgrekas • cache.system = PHP7 array > APCu > files • Offline cache warm-ups for derived cache.validator/serializer/annotations • Fine tuned flex recipes for Doctrine Note: APCu warmup & reset handled properly Best wiring by default

Slide 21

Slide 21 text

Autowiring FTW! use Psr\Cache\CacheInterface; __construct(CacheInterface $cache) or @cache.app in yaml

Slide 22

Slide 22 text

#Symfony_Live @nicolasgrekas framework: cache: app: cache.adapter.redis default_redis_provider: 'redis://%env(REDIS_HOST)%' config/packages/framework.yaml

Slide 23

Slide 23 text

#Symfony_Live @nicolasgrekas framework: cache: pools: forecast.cache: adapter: cache.adapter.pdo config/packages/framework.yaml

Slide 24

Slide 24 text

@forecast.cache in yaml – 4.2 – CacheInterface $forecastCache

Slide 25

Slide 25 text

#Symfony_Live @nicolasgrekas Typical Cache Lifecycle

Slide 26

Slide 26 text

#Symfony_Live @nicolasgrekas Critical Cache Lifecycle

Slide 27

Slide 27 text

– 4.2 – $cache->get($key, $callback)

Slide 28

Slide 28 text

#Symfony_Live @nicolasgrekas

Slide 29

Slide 29 text

#Symfony_Live @nicolasgrekas Cache Stampede at Warm-up

Slide 30

Slide 30 text

#Symfony_Live @nicolasgrekas Cache Stampede at Warm-up

Slide 31

Slide 31 text

#Symfony_Live @nicolasgrekas

Slide 32

Slide 32 text

#Symfony_Live @nicolasgrekas Cache Stampede at Expiration https://en.wikipedia.org/wiki/Cache_stampede

Slide 33

Slide 33 text

– 4.2 – $cache->get($key, $callback, $beta = null)

Slide 34

Slide 34 text

#Symfony_Live @nicolasgrekas Get an item?

Slide 35

Slide 35 text

#Symfony_Live @nicolasgrekas Forcing NO-early expiration

Slide 36

Slide 36 text

#Symfony_Live @nicolasgrekas FORCING early expiration

Slide 37

Slide 37 text

#Symfony_Live @nicolasgrekas Deleting an item

Slide 38

Slide 38 text

$cache->get($key, $callback, $beta = null) – leverages PSR-6 under the hood – 99% of use cases covered!

Slide 39

Slide 39 text

#Symfony_Live @nicolasgrekas Deleting an item

Slide 40

Slide 40 text

– 4.2 – symfony/contracts

Slide 41

Slide 41 text

#Symfony_Live @nicolasgrekas • Cache\{CacheInterface, TagAwareInterface} • Translation\TranslatorInterface • Service\{ResetInterface, ServiceLocatorTrait, ServiceSubscriberInterface, ServiceSubscriberTrait} • v1.0 released at the end of November • README https://github.com/symfony/contracts Symfony\Contracts\

Slide 42

Slide 42 text

– 4.2 – use Symfony\Contracts\Cache\CacheInterface; public function __construct(CacheInterface $cache) $cache->get($key, $callback, $beta = null) $cache->delete($key)

Slide 43

Slide 43 text

#Symfony_Live @nicolasgrekas • Offline recomputation (DI+Messenger+Cache integration) • 1RTT Redis tag invalidation (joint effort with eZ Platform, they use it the most) What’s next?

Slide 44

Slide 44 text

No content