Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Caching with PSRs at PHP Tour

Caching with PSRs at PHP Tour

In this talk you will learn what PSR-6 and PSR-16 are, why they are designed like they are, what the differences are, and how to use them. From the provided interfaces, the virtual package on Packagist.org, to the implementations available. Everything will be explained for both beginners and more experienced developers. We will dive into implementations, cache stampede protection, all using libraries we can find on Packagist.org. We will also show how to start using it today in our current applications by using adapters. The entire talk will be accompanied with code samples and live demos, showing both working and failing caching systems.

Hannes Van De Vreken

May 18, 2018
Tweet

More Decks by Hannes Van De Vreken

Other Decks in Programming

Transcript

  1. Caching with PSRs
    PHP Tour Montpellier
    #phptour @hannesvdvreken

    View Slide

  2. Hi, my name is Hannes.

    View Slide

  3. Caching PSRs
    Caching in PHP anno 2018

    View Slide

  4. 1. Intro
    2. Caching in 2015
    3. Hello PSR-6
    4. Hello PSR-16

    View Slide

  5. 1. Intro
    what is caching?

    View Slide

  6. WHAT IS CACHING
    Speeding up your
    app

    View Slide

  7. WHAT IS CACHING
    1. Query stored value
    2.Execute slow task
    3.Remember result

    View Slide

  8. WHAT IS CACHING
    Should not cause
    app failure

    View Slide

  9. WHAT IS CACHING - EXAMPLES
    • HTTP Request
    • Slow DB call
    • Process image/zip/…

    View Slide

  10. WHAT IS CACHING
    Should not cause
    app failure

    View Slide

  11. WHAT IS CACHING
    geocode IP
    check cache store result
    check cache

    View Slide

  12. WHAT IS CACHING
    Should not cause
    app failure

    View Slide

  13. WHAT IS CACHING
    At different layers:
    User-Agent
    Webserver (Varnish/Nginx)
    Application
    Opcache

    View Slide

  14. WHAT IS CACHING
    Should not cause
    app failure

    View Slide

  15. WHAT IS CACHING
    • cache busting
    • TTL
    • warming up

    View Slide

  16. 2. Caching in 2015
    the state of caching (pre PSR-FIG)

    View Slide

  17. APPLICATION CACHING IN 2015
    1. Libraries do it
    2.Frameworks do it
    3.Cache libs do it

    View Slide

  18. APPLICATION CACHING IN 2015
    Frameworks & cache libs have their own:
    - set of supported caching back-
    ends
    - maybe an interface to allow
    custom implementations

    View Slide

  19. APPLICATION CACHING IN 2015
    Adapters everywhere!

    View Slide

  20. APPLICATION CACHING IN 2015
    Framework X cache Framework Y cache
    Package W cache Cache package Z
    Adapter W->X Adapter W->Y
    Adapter W->Z
    Adapter Y->Z

    View Slide

  21. APPLICATION CACHING IN 2015
    If no adapter available
    - Write your own
    - Store in different cache stores

    (ops will not love you for that)

    View Slide

  22. 3. Hello PSR-6

    View Slide

  23. INTRODUCING PSR-6
    Finalized & accepted
    in December 2015

    View Slide

  24. INTRODUCING PSR-6
    Repository - Entity

    View Slide

  25. INTRODUCING PSR-6
    use Psr\Cache\CacheItemPoolInterface;
    use Psr\Cache\CacheItemInterface;
    $item = $pool->getItem($key);
    $item->getKey();
    $item->get();

    View Slide

  26. INTRODUCING PSR-6
    Item is an entity,
    it’s not immutable,
    but the Key is

    View Slide

  27. INTRODUCING PSR-6
    Don’t instantiate your own Items.
    $item = $pool->getItem(‘key’)
    ->set($value)
    ->expiresAfter(3600);
    $pool->save($item);

    View Slide

  28. INTRODUCING PSR-6
    Pool has support for multi-actions
    $pool->getItems($keys);
    $pool->saveDeferred($item);
    $pool->commit();

    View Slide

  29. INTRODUCING PSR-6
    Repository - Entity model
    allows extensions

    View Slide

  30. INTRODUCING PSR-6
    Allows future specced features by
    reserving characters
    - {}()/\@:

    View Slide

  31. INTRODUCING PSR-6
    Cache features:
    - Stampede protection:
    Parallel incoming requests
    executing long process to
    update cache value

    View Slide

  32. STAMPEDE PROTECTION

    View Slide

  33. STAMPEDE PROTECTION

    View Slide

  34. STAMPEDE PROTECTION

    View Slide

  35. STAMPEDE PROTECTION

    View Slide

  36. STAMPEDE PROTECTION

    View Slide

  37. STAMPEDE PROTECTION

    View Slide

  38. STAMPEDE PROTECTION

    View Slide

  39. STAMPEDE PROTECTION

    View Slide

  40. STAMPEDE PROTECTION

    View Slide

  41. INTRODUCING PSR-6
    Cache features:
    - Stampede protection
    - Taggable cache
    cache/taggable-cache

    View Slide

  42. INTRODUCING PSR-6
    Cache features:
    - Stampede protection
    - Taggable cache
    $item->setTags([‘cat-1']);
    $pool->invalidateTags([‘cat-1’]);

    View Slide

  43. INTRODUCING PSR-6
    Cache features:
    - Stampede protection
    - Taggable cache
    - Hierarchical cache
    cache/hierarchical-cache

    View Slide

  44. INTRODUCING PSR-6
    Cache features:
    - Stampede protection
    - Taggable cache
    - Hierarchical cache
    $pool->hasItem('|users|4711|followers'); // true
    $pool->delete(‘|users|4711');
    $pool->hasItem('|users|4711|followers'); // false

    View Slide

  45. Practical
    who uses it, and how can I use it?

    View Slide

  46. View Slide

  47. View Slide

  48. View Slide

  49. START USING IT
    Integration tests for
    implementations:
    cache/integration-tests

    View Slide

  50. View Slide

  51. START USING IT
    class PoolIntegrationTest extends CachePoolTest
    {
    public function createCachePool()
    {
    return new MyCustomCachePool();
    }
    }

    View Slide

  52. START USING IT
    cache/taggable-cache
    cache/namespaced-cache
    cache/hierarchical-cache
    cache/chain-adapter
    cache/array-adapter
    cache/void-adapter
    cache/prefix-adapter

    View Slide

  53. START USING IT - UPGRADE
    Upgrade paths

    View Slide

  54. START USING IT - UPGRADE
    Libraries

    View Slide

  55. START USING IT - UPGRADE
    Libraries (next major versions)
    have a PSR-6 caching decorator

    View Slide

  56. START USING IT - UPGRADE
    Frameworks

    View Slide

  57. START USING IT - UPGRADE
    Start using PSR-6 enabled libraries
    with adapters for current FW’s
    implementation.

    View Slide

  58. START USING IT - UPGRADE
    Example:
    symfony/cache
    cache/illuminate-adapter

    View Slide

  59. START USING IT
    Adoption?

    View Slide

  60. View Slide

  61. 4. Hello PSR-16

    View Slide

  62. INTRODUCING PSR-16
    Finalised & accepted
    in December 2016

    View Slide

  63. One simple interface
    INTRODUCING PSR-16

    View Slide

  64. Psr\SimpleCache\CacheInterface
    INTRODUCING PSR-16

    View Slide

  65. // Returns null when not available.
    // Returns null when you set it to null.
    $cache->set($key, null);
    $value = $cache->get($key); // null
    INTRODUCING PSR-16

    View Slide

  66. $cache->set($key, new ValueObject());
    INTRODUCING PSR-16

    View Slide

  67. CacheInterface::getMultiple
    CacheInterface::setMultiple
    CacheInterface::deleteMultiple
    INTRODUCING PSR-16

    View Slide

  68. Differences from PSR-6
    - No `null` values
    - No deferring
    INTRODUCING PSR-16

    View Slide

  69. Also allows future extension thanks to
    reservation of characters
    - {}()/\@:
    INTRODUCING PSR-16

    View Slide

  70. Practical
    who uses it, and how can I use it?

    View Slide

  71. View Slide

  72. View Slide

  73. START USING IT
    Upgrade path?
    Same as PSR-6

    View Slide

  74. START USING IT
    Adoption?

    View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. $laravelCache = App::make(‘cache’);
    $psr6Cache = new IlluminateCachePool($laravelCache);
    $psr16Cache = new SimpleCacheBridge($psr6Cache);
    INTRODUCING PSR-16

    View Slide

  79. 1. Intro
    2. Caching in 2015
    3. Hello PSR-6
    4. Hello PSR-16
    RECAP

    View Slide

  80. Thank you!
    #phptour @hannesvdvreken

    View Slide

  81. Time for questions!
    #phptour @hannesvdvreken

    View Slide