WordPress käyttää useita eri välimuistikerroksia samanaikaisesti, mutta moni kehittäjä tuntee niistä vain page cachen tai Redisin. Todellisuudessa WordPressissä on sisäinen cache-järjestelmä, joka vaikuttaa lähes kaikkeen: queryihin, metadataan, optioneihin ja objecteihin.
WordPressin cache-järjestelmä voidaan jakaa useaan tasoon:...
WordPressissä lähes kaikki kulkee object cachen kautta....
Ilman Redisia tai Memcachedia WordPress käyttää:...
Kun Redis tai Memcached lisätään:...
WordPress jakaa cachen ryhmiin:...
Joitain grouppeja ei koskaan tallenneta pysyvästi:...
Kun WP_Query suoritetaan:...
Kun post haetaan:...
wp_options on erittäin cache-riippuvainen....
Ongelma syntyy kun:...
Transients on WordPressin “kevyt cache API”....
Vaikein osa cache-järjestelmiä....
Vaikein osa cache-järjestelmiä....
Kun post päivitetään:...
WP_Query hyödyntää object cachea epäsuorasti....
WordPress ei oletuksena cacheta REST-vastauksia kunnolla....
Voit cachettaa osia HTML:stä:...
Kun cache vanhenee:...
Redis nopeuttaa erityisesti:...
Moderni WordPress käyttää yleensä:...
Hyvä object cache:...
Hyvä object cache:...
Moderni WordPress stack:...
Moderni WordPress stack:...
WordPressin sisäinen cache-järjestelmä on paljon enemmän kuin pelkkä page cache. Object cache, metadata cache, options cache ja transientit muodostavat kerroksellisen järjestelmän, joka vaikuttaa lähes kaikkiin...
Kun tämän rakenteen ymmärtää, suorituskyvyn optimointi muuttuu huomattavasti tehokkaammaksi.
Mitä WordPress cache tarkoittaa
WordPressin cache-järjestelmä voidaan jakaa useaan tasoon:
Browser Cache
↓
CDN / Edge Cache
↓
Page Cache
↓
Object Cache
↓
Database
WordPressin “sisäinen cache” viittaa yleensä:
- Object Cache APIin
- transientteihin
- runtime cacheen
Object Cache API
WordPressissä lähes kaikki kulkee object cachen kautta.
Keskeiset funktiot:
wp_cache_get()
wp_cache_set()
wp_cache_delete()
Esimerkki:
wp_cache_set('user_1', $data, 'users', 3600);
$data = wp_cache_get('user_1', 'users');
Runtime cache (oletus)
Ilman Redisia tai Memcachedia WordPress käyttää:
non-persistent in-memory cache
Tämä tarkoittaa:
- cache toimii vain yhden requestin ajan
- seuraava request aloittaa tyhjästä
Silti tämä vähentää duplicate queryjä requestin sisällä.
Persistent object cache
Kun Redis tai Memcached lisätään:
WordPress → Redis → Database
Cache säilyy requestien välillä.
Hyödyt:
- vähemmän DB-queryjä
- nopeampi admin
- nopeampi frontend
- parempi skaalautuvuus
Cache groups
WordPress jakaa cachen ryhmiin:
wp_cache_set($key, $data, 'posts');
Tyypillisiä grouppeja:
- posts
- users
- terms
- options
Non-persistent groups
Joitain grouppeja ei koskaan tallenneta pysyvästi:
wp_cache_add_non_persistent_groups();
Näitä käytetään request-kohtaiseen dataan.
WP_Query ja object cache
Kun WP_Query suoritetaan:
$query = new WP_Query([...]);
WordPress cachettaa:
- post objectit
- metadata
- taxonomyt
Tämä vähentää duplicate SELECTejä.
Metadata cache
Kun post haetaan:
get_post_meta($id);
Meta cache ladataan usein automaattisesti.
Tämä estää:
N+1 query problem
Options cache
wp_options on erittäin cache-riippuvainen.
get_option('siteurl');
Options cache on yksi tärkeimmistä WordPressin optimoinneista.
Autoloaded options
Ongelma syntyy kun:
autoload = yes
liikaa dataa.
Kaikki autoloaded optionit ladataan jokaisella requestilla.
Huono tilanne:
10MB autoload data
Transients API
Transients on WordPressin “kevyt cache API”.
set_transient('key', $data, 3600);
Luku:
$data = get_transient('key');
Ilman Redisia:
- tallentuu DB:hen
Redisin kanssa:
- tallentuu memoryyn
Transient vs object cache
Object cache
- request-level API
- low-level cache
Transient
- expiration built-in
- helpompi käyttää
Cache invalidation
Vaikein osa cache-järjestelmiä.
WordPress invalidioi automaattisesti paljon:
save_post()
clean_post_cache()
Mutta custom cache pitää invalidioida itse.
Post cache invalidation
Kun post päivitetään:
clean_post_cache($post_id);
Tämä poistaa:
- post objectit
- metadata
- taxonomy cachet
Query cache
WP_Query hyödyntää object cachea epäsuorasti.
Mutta monimutkaiset meta_queryt:
- eivät aina hyödy hyvin cachetuksesta
REST API cache
WordPress ei oletuksena cacheta REST-vastauksia kunnolla.
Usein tarvitaan:
- transient cache
- Redis layer
- edge cache
Fragment cache
Voit cachettaa osia HTML:stä:
$cached = wp_cache_get('hero_section');
if (!$cached) {
$cached = render_hero();
wp_cache_set('hero_section', $cached);
}
echo $cached;
Cache stampede ongelma
Kun cache vanhenee:
100 requestia regeneroi saman datan
Ratkaisut:
- locking
- stale cache
- background regeneration
Redis object cache WordPressissä
Redis nopeuttaa erityisesti:
- WooCommerce
- isot sivustot
- membership-sivut
- multisite-ympäristöt
Cache layers käytännössä
Moderni WordPress käyttää yleensä:
Browser cache
↓
CDN cache
↓
Page cache
↓
Redis object cache
↓
MySQL
Mitä EI pidä cachettaa
- nonce data
- user-specific HTML
- checkout state
- session data ilman variaatiota
Cache hit ratio
Hyvä object cache:
90–99% hit ratio
Huono:
paljon miss-tapauksia
Yleisimmät cache-ongelmat
- liikaa autoloaded options
- invalidointi puuttuu
- transient-spämmi
- object cache ilman strategiaa
- cachettamaton REST API
- user-specific cache leak
Paras cache-arkkitehtuuri
Moderni WordPress stack:
- Edge cache/CDN
- NGINX FastCGI cache
- Redis object cache
- OPcache
- transient strategy
- targeted invalidation
Yhteenveto
WordPressin sisäinen cache-järjestelmä on paljon enemmän kuin pelkkä page cache. Object cache, metadata cache, options cache ja transientit muodostavat kerroksellisen järjestelmän, joka vaikuttaa lähes kaikkiin WordPress-requesteihin.
Kun nämä kerrokset ymmärretään ja niitä käytetään oikein yhdessä Redisin ja edge-cachen kanssa, WordPress pystyy käsittelemään erittäin suuria liikennemääriä tehokkaasti.