Gyorsítótár érvénytelenítése — az elavult adatok eltávolításának vagy frissítésének folyamata a gyorsítótárban az alkalmazás által kapott információk naprakészségének biztosítása érdekében. A mobilfejlesztésben az érvénytelenítés kritikus fontosságú: a felhasználó friss adatokat vár teljes újratöltés nélkül. A Google Developers, 2025 adatai szerint a helyesen konfigurált érvénytelenítés 60%-kal csökkenti a hálózati kéréseket és javítja a felület válaszkészségét.
Főbb pontok
Gyorsítótár érvénytelenítése — a gyorsítótárazott rekordok visszavonásának vagy frissítésének folyamata, amelyek már nem felelnek meg az adatforrás aktuális állapotának. A teljes gyorsítótár kézi törlésével ellentétben az érvénytelenítés pontszerűen működik: csak azokat az adatokat érinti, amelyek naprakészsége kérdéses.
A gyorsítótár másolatokat tárol az adatokról a gyors hozzáférés érdekében. Idővel az adatbázisban vagy a szerveren lévő eredeti adatok megváltozhatnak — például a felhasználó frissítette a profilját, vagy új bejegyzés jelent meg a hírfolyamban. Ha a gyorsítótár nem érvénytelenül, az alkalmazás elavult információkat jelenít meg, ami mobilalkalmazásokban tranzakciós hibákhoz, helytelen megjelenítéshez és bizalomvesztéshez vezet.
Az érvénytelenítés fő nehézsége — a jól ismert mondás „There are only two hard things in Computer Science: cache invalidation and naming things”. A bonyolultság abban rejlik, hogy a gyorsítótár nem tudja, mikor változott a forrás, ha nem értesítik kifejezetten.
Martin Kleppmann, a „Designing Data-Intensive Applications” (O’Reilly, 2017) című könyv szerzője szerint a helyes érvénytelenítéshez vagy központosított változásértesítésre van szükség, vagy egy olyan mechanizmusra, amely minden olvasáskor ellenőrzi a naprakészséget — kompromisszum a teljesítmény és a konzisztencia között.
data class CacheEntryT(
val data: T,
val expiresAt: Long,
val version: Int = 0
)
fun CacheT.isValid(key: String): Boolean =
get(key)?.let { it.expiresAt > currentTimeMillis() && it.version == currentVersion(key) } ?: false
Ez a kód egy egyszerű megközelítést mutat: a gyorsítótárban lévő rekord érvényesnek tekinthető, ha a TTL nem járt le és a verzió megegyezik a forrásban lévő aktuális verzióval. A verziókezelő mechanizmus — az egyik megbízható módja az elavult adatok megjelenítésének elkerülésére.
Az adatok naprakészsége — kulcsfontosságú követelmény a legtöbb mobilalkalmazás számára: közösségi hálózatok, üzenetküldők, banki szolgáltatások, e-commerce platformok. Az a felhasználó, aki helytelen számlaegyenleget vagy régi üzeneteket lát, elveszíti a bizalmát az alkalmazás iránt.
A felhasználói élmény mellett az érvénytelenítés megoldja a forgalom- és akkumulátormegtakarítás problémáját is. Az időszakos teljes adatújratöltés helyett a mobilalkalmazás csak a megváltozott rekordokat érvénytelenítheti és töltheti be pontszerűen. A Meta Engineering (2024) adatai szerint az inkrementális érvénytelenítés bevezetése a Facebook Lite-ban 35%-kal csökkentette a forgalomfogyasztást a tartalom naprakészségének elvesztése nélkül.
Egy másik fontos szempont — a tranzakciók konzisztenciája. A bevásárlókosárral vagy foglalásokkal rendelkező alkalmazásokban az elavult gyorsítótár használata kétszeres terheléshez vagy adatütközésekhez vezethet. A kritikus műveletek utáni érvénytelenítés garantálja, hogy a következő kérés friss adatokat olvasson.
TTL — a legegyszerűbb stratégia, amelyben minden rekord a gyorsítótárban rögzített élettartamot kap. A TTL lejárta után az adatok elavultnak minősülnek és a következő olvasáskor törlődnek. A TTL ideális az ütemezés szerint frissülő adatokhoz — például időjárás vagy valutaárfolyam. Hátrány: az adatok a TTL-intervallumon belül is elavulhatnak.
A Write-Through stratégiában minden adatváltozás áthalad a gyorsítótáron: az írás egyszerre történik a gyorsítótárba és a forrásba. Ez garantálja, hogy a gyorsítótár mindig a jelenlegi verziót tartalmazza. Hátrány — az írási késleltetés nő, mivel a művelet nem fejeződik be a forrás visszaigazolásáig. A Write-Through a konzisztencia szempontjából kritikus adatokhoz alkalmas: számlaegyenleg, rendelés állapota.
Write-Behind — aszinkron írás: az adatok azonnal a gyorsítótárba kerülnek, a forrásba pedig később egy külön folyamat írja őket. Ez magas írási teljesítményt nyújt, de adatvesztés kockázatával jár, ha hiba történik a szinkronizálás előtt. Mobilalkalmazásokban a Write-Behind gyakran használatos analitikához, naplókhoz és nem kritikus felhasználói műveletekhez.
Write-Invalidate — a gyorsítótár frissítése helyett az adatváltozáskor egyszerűen törli (érvényteleníti) a megfelelő rekordot. A következő olvasás gyorsítótár-hibát észlel és friss adatokat tölt be a forrásból. Ez a stratégia egyszerűen megvalósítható és jól működik, ha az olvasási kérések száma jelentősen meghaladja az írási kérésekét.
| Stratégia | Olvasási teljesítmény | Írási teljesítmény | Konzisztencia |
|---|---|---|---|
| TTL | Magas | Magas | Gyenge (lehetséges elavulás) |
| Write-Through | Magas | Közepes | Erős |
| Write-Behind | Magas | Magas | Gyenge (lehetséges veszteség) |
| Write-Invalidate | Közepes | Magas | Erős (következő olvasáskor) |
A stratégia kiválasztása attól függ, hogy mi az elsődleges az adott forgatókönyvben: válaszsebesség, konzisztencia vagy erőforrás-megtakarítás. A hibrid megközelítések — például TTL Write-Invalidate-tel push-értesítés fogadásakor — optimális egyensúlyt biztosítanak.
HTTP gyorsítótár — az első szint az ügyfél oldalán. A böngésző vagy mobilalkalmazás tárolja a szerver válaszait Cache-Control és ETag fejlécekkel. Az érvénytelenítés 304 Not Modified válasz fogadásakor vagy a max-age lejártakor történik. Az ETag lehetővé teszi az ügyfél számára, hogy a teljes válasz letöltése nélkül ellenőrizze a forrás naprakészségét.
Alkalmazás gyorsítótár — a második szint, kód által kezelt: memórián belüli gyorsítótárak (LRU, LruCache Androidban) vagy lemezes (SQLite, Room, Realm). Az érvénytelenítést itt a fejlesztő irányítja. A Android Developers (2025) adatai szerint a Room helyes használata Flow-val és triggereken keresztüli érvénytelenítéssel 40%-kal csökkenti a felület újrarajzolásainak számát.
Szerver gyorsítótár — a harmadik szint: Redis, Memcached, CDN. Ezen a szinten az érvénytelenítés TTL, DEL/PURGE parancsok vagy üzenetbrókerek (RabbitMQ, Kafka) révén történik. A CDN-érvénytelenítés — külön feladat: a CDN elosztott jellege miatt a törlési parancs percekig is terjedhet. A Cloudflare (2024) adatai szerint a Purge by URL-en keresztüli érvénytelenítés átlagosan 5–15 másodpercet vesz igénybe a globális terjesztéshez.
Az érvénytelenítés összehangolásához minden szinten központosított gyorsítótár-szolgáltatást vagy eseménybrokert használnak. Az adatok változásakor a forrás közzétesz egy eseményt, és minden szint parancsot kap meghatározott kulcsok érvénytelenítésére. Ez megakadályozza azt a helyzetet, amikor az egyik szint már frissítette az adatokat, míg a másik továbbra is az elavult verziót szolgáltatja.
Túl hosszú TTL — a leggyakoribb hiba. A fejlesztők “tartalékkal” állítják be a TTL-t, ami ahhoz vezet, hogy a felhasználók órákig vagy napokig látnak elavult adatokat. Megoldás: kezdje rövid TTL-lel (1–5 perc), és csak a valós igény mérése után növelje.
A teljes gyorsítótár érvénytelenítése egyetlen változtatásnál — tipikus probléma mikroszolgáltatás-architektúrában. Egy felhasználó frissítette az avatárját, és a gyorsítótár mindenki számára érvénytelenül. Sok felhasználó esetén ez Cache Stampede hatást okoz — lavinaszerű kéréseket a forráshoz. Megoldás: csak az adott felhasználó kulcsát érvénytelenítse, ne a teljes gyorsítótárat.
Az érvénytelenítés hiánya írási hibáknál — ha a forrásba írás meghiúsul, de a gyorsítótár már frissült, az alkalmazás inkonzisztens állapotba kerül. Megoldás: kétfázisú érvénytelenítés — először törölje a gyorsítótárat, majd írjon a forrásba, és hiba esetén vonja vissza az érvénytelenítést.
Az elosztott jelleg figyelmen kívül hagyása — klaszter környezetben az egyik csomóponton történő érvénytelenítés nem jelenti azt, hogy a többi csomópont megkapta a parancsot. Eseménybróker nélkül a szerverek egy része továbbra is elavult adatokat szolgáltat. Redis Pub/Sub vagy Apache Kafka megoldja ezt a problémát az érvénytelenítési események terjesztésével.
Határozza meg a naprakészségi követelményeket — mennyire kritikus, hogy az adatok “azonnal” frissek legyenek. Hírcsatorna esetén 1–2 perces késés elfogadható (TTL). Számlaegyenleg esetén a késés elfogadhatatlan (Write-Through).
Mérje fel a változások gyakoriságát — a naponta egyszer frissülő adatok (termékkatalógus, városkalauz) kiválóan működnek TTL-lel. A másodpercenként többször változó adatok (online állapot, valutaárfolyam) push-érvénytelenítést igényelnek WebSocketen vagy Firebase Cloud Messagingen keresztül.
Vegye figyelembe a forrásolvasás költségét — ha a forrás egy drága SQL-lekérdezés 10 táblán vagy egy külső API korlátokkal, jobb agresszív gyorsítótárazást használni hosszú TTL-lel, de az elavult adatokat push-érvénytelenítéssel kompenzálni. Ha az olvasás olcsó (in-memory lookup), rövid TTL és Write-Invalidate használható.
A Google I/O (2025) adatai szerint a mobilalkalmazások tipikus mintája — Stale-While-Revalidate: a felhasználó azonnal látja a gyorsítótárazott adatokat, az alkalmazás pedig a háttérben ellenőrzi azok naprakészségét és frissíti őket. Ez kompromisszumok nélkül ötvözi a válaszsebességet és a naprakészséget. Az HTTP Cache-Control fejléc a stale-while-revalidate direktívával Android 10 és iOS 13 óta támogatott.
Gyakran ismételt kérdések
Érvénytelenítés — egy adott rekord elavultként való megjelölése, ami után a következő olvasáskor frissül. A gyorsítótár törlése az összes rekord teljes eltávolítása, ami költségesebb és átmenetileg csökkentheti az alkalmazás teljesítményét.
ETag — a forrás hash-e vagy verziója, amelyet a szerver az HTTP fejlécben ad vissza. Ismételt kérésnél az ügyfél elküldi az If-None-Match-ot a jelenlegi ETag-gel. Ha a forrás nem változott, a szerver 304 Not Modified választ ad, és a gyorsítótár érvényes marad.
Write-Through verziókezeléssel — a legmegbízhatóbb, mert az adatok mindig konzisztensek. De a legnagyobb írási késleltetést adja. A gyakorlatban gyakrabban használnak TTL-t push-érvénytelenítéssel a teljesítmény és a naprakészség egyensúlyához.
Használjon Probabilistic Early Expiration — minden kérés véletlenszerűen ellenőrzi a gyorsítótár naprakészségét a TTL lejárta előtt. Az XFetch algoritmus (Vattani, 2015) kiszámítja az újraszámítás valószínűségét a képlet alapján: p = (ttl - age) / (ttl * beta).
Használjon hálózati hibakereső eszközöket: Charles Proxy, Proxyman vagy a beépített Network Inspector az Android Studio-ban és Xcode-ban. Ellenőrizze, hogy az adatmódosítás után a következő kérés tényleg az új verziót töltse be, ne a gyorsítótárazottat adja vissza.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is