Doctrine 2

Není cache jako cache

Jsem Tomáš :)

programátor

školitel

rodič

 

Kdo zná Doctrine?

Kdo používá Doctrine?

V čem nám pomáhá Doctrine?

  • odstiňuje programátora od komunikace s databáz

  • automaticky řeší běžné operace (čtení/zápis/mazání

  • automaticky provádí konverzi datových typů

  • poskytuje programátorovi objektový přístup k datům pomocí entit

  • řeší základní výkonnostní optimalizace

     

Kdo už řešil optimalizaci Doctrine?

Život bez cache...

Život s cache...

Proč zapnout cache?

Proč zapnout cache?

  • Odstranění opakující se práce
  • Rychlejší odezva aplikace
  • Snížení zátěže databáze
  • Další  point of failure
  • Problémy s invalidací
  • Zvýšení zátěže cache

Co máme k dispozici?

  • Metadata cache
  • Query cache
  • Result cache
  • Second Level Cache

        a bonus...

Dokumentace radí!

Metadata Cache

<?php

/** @Entity */
class User
{
    /**
     * @ManyToOne(targetEntity="Address")
     * @JoinColumn(name="address_id", referencedColumnName="id")
     */
    private $address;
}

Co to jsou metadata?

Metadata Cache

Jak cache zapnout?

<?php

$config = new \Doctrine\ORM\Configuration();

$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ApcuCache());

Query Cache

<?php

$query = $em->createQuery(
    'SELECT u FROM MyProject\Model\User u WHERE u.age > 20'
);

$users = $query->getResult();

Co je to query?

Query Cache

Jak cache zapnout?

<?php

$config = new \Doctrine\ORM\Configuration();

$config->setQueryCacheImpl(new \Doctrine\Common\Cache\ApcuCache());

Result Cache

<?php

$query = $em->createQuery(
    'SELECT u FROM MyProject\Model\User u WHERE u.age > 20'
);

$users = $query->useResultCache(true)
    ->setResultCacheLifetime(3600)
    ->getResult();

Co je to result?

Result Cache

Jak cache zapnout?

<?php

$config = new \Doctrine\ORM\Configuration();

$config->setResultCacheImpl(new \Doctrine\Common\Cache\ApcuCache());

Second Level Cache!

Second Level Cache

<?php
/**
 * @Entity
 * @Cache("NONSTRICT_READ_WRITE")
 */
class State
{

    /**
     * @Column(unique=true)
     */
    protected $name;

    /**
     * @Cache("NONSTRICT_READ_WRITE")
     * @OneToMany(targetEntity="City", mappedBy="state")
     */
    protected $cities;

}

Co to je Second level Cache?

Second Level Cache

Různé způsoby ukládání dat

Způsob Editace? Rychlost? Zámky?
READ_ONLY NE +1 NE
NONSTRICT_READ_WRITE ANO 0 NE
READ_WRITE ANO -1 ANO

Second Level Cache

Podporuje regiony!

Second Level Cache

Podporuje regiony!

<?php
/**
 * @Entity
 * @Cache("NONSTRICT_READ_WRITE", region="state_region")
 */
class State
{

    /**
     * @Column(unique=true)
     */
    protected $name;

    /**
     * @Cache("NONSTRICT_READ_WRITE")
     * @OneToMany(targetEntity="City", mappedBy="state")
     */
    protected $cities;

}

Second Level Cache

Jak cache zapnout?

<?php

$config = new \Doctrine\ORM\Configuration();
$cache = new \Doctrine\Common\Cache\Cache();
$factory = new \Doctrine\ORM\Cache\DefaultCacheFactory($config, $cache);

$config->setSecondLevelCacheEnabled();

$config->getSecondLevelCacheConfiguration()
    ->setCacheFactory($factory);

TY!

Shrnutí...

  • Metadata a Query cache jsou nutnost!
  • Result cache se hodí ;)
  • Second Level Cache je kamarád :)
  • Zapnutí cache je většinou jeden řádek kódu :D
  • Šetříme zdroje a zrychlujeme odezvu aplikace
  • Pozor na přetěžování cache!
  • Doctrine dokumentace - palec nahoru!

Díky za pozornost!

Nějaké otázky?

 

tomaspilar.cz  |        @tomaspilaru

Doctrine ŠKOLENÍ

již tento měsíc

26. 11. 2018

Doctrine - Není cache jako cache

By tomaspilar

Doctrine - Není cache jako cache

  • 1,699