@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

Saat tuoreimmat 10 uusinta artikkelia kerran viikossa sähköpostiisi.

Tilaa uutiskirje

WordPress transients vs object cache – viiveen minimointiWordPressin suorituskykyoptimoinnissa kaksi usein sekoitettua käsitettä ovat Transients API ja Object Cache. Molempien tarkoitus on vähentää tietokantakuormaa ja nopeuttaa sivustoa, mutta ne ratkaisevat eri ongelmia ja toimivat eri tasoilla.
Kun ymmärtää näiden erot ja käyttökohteet, voidaan merkittävästi pienentää vasteaikoja, vähentää tietokantakyselyitä ja parantaa sivuston skaalautuvuutta.

Mikä on Transients API?

Transients API on WordPressin tarjoama tapa tallentaa väliaikaista dataa.

Esimerkki:

set_transient(
    'latest_products',
    $products,
    HOUR_IN_SECONDS
);

Datan haku:

$products = get_transient('latest_products');

Transienteilla on aina vanhenemisaika, jonka jälkeen data voidaan poistaa automaattisesti.

Tyypillisiä käyttökohteita:

  • API-vastaukset
  • raporttidata
  • hitaat tietokantakyselyt
  • ulkoisten palveluiden vastaukset

Mikä on Object Cache?

Object Cache toimii alemmalla tasolla WordPressin sisällä.

Se tallentaa esimerkiksi:

  • WP_Query-tuloksia
  • options-dataa
  • metadataa
  • käyttäjätietoja
  • termitietoja

Esimerkki:

wp_cache_set(
    'featured_posts',
    $data,
    'homepage',
    3600
);

Haku:

$data = wp_cache_get(
    'featured_posts',
    'homepage'
);

Object Cache voi olla:

  • ei-pysyvä (vain requestin ajan)
  • pysyvä Redisillä tai Memcachedilla

Suurin ero

Transients:

Sovelluskerroksen välimuisti

Object Cache:

WordPressin sisäinen suorituskykykerros

Transients on tarkoitettu kehittäjän hallittavaksi.

Object Cache optimoi WordPressin omaa toimintaa.

Ilman persistent object cachea

Jos Redis tai Memcached ei ole käytössä:

Transient
↓
wp_options
↓
MySQL

Tällöin transientin hakeminen voi edelleen osua tietokantaan.

Persistent object cache käytössä

Redis-esimerkki:

Transient
↓
Object Cache
↓
Redis

Tällöin transientitkin voivat hyötyä muistivälimuistista.

Milloin käyttää transienteja?

Hyviä käyttökohteita:

  • ulkoiset API-kutsut
  • raportit
  • dashboard-widgetit
  • hitaat aggregaattikyselyt

Esimerkki:

$data = get_transient('weather_data');

if (!$data) {

    $data = fetch_weather_api();

    set_transient(
        'weather_data',
        $data,
        1800
    );
}

Milloin käyttää object cachea?

Hyviä käyttökohteita:

  • query-tulokset
  • laskennallisesti raskaat operaatiot
  • toistuvat tietorakenteet
  • requestien välillä jaettava data

Esimerkki:

$data = wp_cache_get(
    'featured_products',
    'products'
);

if (!$data) {

    $data = expensive_query();

    wp_cache_set(
        'featured_products',
        $data,
        'products',
        3600
    );
}

Viiveen minimointi käytännössä

Yleinen ongelma:

Page Load
↓
20 tietokantakyselyä
↓
300ms+

Optimoitu malli:

Page Load
↓
Redis Cache Hit
↓
alle 5ms

Cache invalidointi

Välimuisti on hyödyllinen vain, jos se pysyy ajan tasalla.

Esimerkki:

add_action(
    'save_post_product',
    function () {

        delete_transient(
            'featured_products'
        );

    }
);

Object Cachessa:

wp_cache_delete(
    'featured_products',
    'products'
);

Cache stampede -ongelma

Tilanne:

Cache vanhenee
↓
100 käyttäjää
↓
100 rebuildia

Ratkaisut:

  • locking
  • stale cache
  • background regeneration

Redis ja WordPress

Redis on yleisin persistent object cache.

Hyödyt:

  • erittäin nopeat haut
  • pienempi tietokantakuorma
  • parempi skaalautuvuus
  • nopeammat REST API -vastaukset

Monilla sivustoilla Redis vähentää tietokantakyselyitä kymmeniä prosentteja.

Yleisimmät virheet

  • transientteja käytetään pysyvänä tietovarastona
  • ei cache invalidointia
  • liian lyhyt TTL
  • liian pitkä TTL
  • Redis puuttuu suurilta sivustoilta
  • valtavia tietomassoja tallennetaan cacheen

Paras käytäntö

Käytä:

  • Object Cachea WordPressin sisäisen suorituskyvyn optimointiin
  • Transientteja sovelluslogiikan välimuistina
  • Redisia persistent object cache -ratkaisuna
  • automaattista invalidointia sisältömuutosten yhteydessä

Yhteenveto

Transients API ja Object Cache eivät ole kilpailijoita, vaan toisiaan täydentäviä työkaluja. Transientit sopivat sovellustason välimuistiin, kun taas Object Cache optimoi WordPressin sisäistä toimintaa.

Parhaan suorituskyvyn saavuttaa yhdistämällä Redis-pohjaisen persistent object cachen, oikein suunnitellut transientit ja tehokkaan cache invalidoinnin. Tällöin vasteajat lyhenevät merkittävästi ja tietokantakuorma pysyy hallinnassa myös suurilla WordPress-sivustoilla.

🍪