Cache api használatával

Webes alkalmazások létrehozásakor gyakran gyorsítótárazási feladatok vannak a gyors elérés érdekében. ASP-időkben az alkalmazásobjektumot az adatok gyorsítótárazására használta. Ez a megközelítés adta egy kényelmes módja, hogy mentse termékek és az azokhoz való hozzáférés bármely weboldalon az alkalmazás, de ez is végzett néhány komolyabb probléma, mint például a potenciális kimerülését rendelkezésre álló memória, az aktív megőrzése a tárgyak a bejelentés és a probléma nyomkövető ezeket a változásokat és frissítés tárgyak megváltozott adatokkal.

Ez a probléma (az Alkalmazásobjektum objektumok gyorsítótárának használatával) számos klasszikus ASP szörnyeteggel foglalkozó megbeszélést és cikket szentelt. Természetesen ez a probléma nem hagyható figyelmen kívül a Microsoft az ASP.NET fejlesztésekor. Ennek eredményeképpen egyszerű és elegáns megoldást kínáltak.

Az ASP.NET-ben a HttpApplication osztály mellett egy további HttpCache osztály került bevezetésre kifejezetten az objektum gyorsítótár létrehozására. Ezzel az osztályozással nagyon hasonlít az Alkalmazással való munkavégzéshez, de jelentős különbségek is vannak. Először is, ezek a különbségek a fenti problémák megoldására irányulnak:

  • Memória kezelése - a gyorsítótár automatikusan törölheti az objektumokat a túlcsordulás túlcsordulásához.
  • Objektumok megsemmisítése esemény bekövetkezésekor - egy objektum elhelyezhető a gyorsítótárban, és eltávolításra vonatkozó szabályokat tartalmaz.
  • Hívások visszahívása - a gyorsítótár támogatja a hívási módokat, amikor objektumokat töröl a gyorsítótárból.

A gyorsítótár elérése a jelenlegi webes alkalmazás kontextus Cache tulajdonságán keresztül történik. Objektumokat elhelyezhet a cache-ben implicit módon (valamint az Alkalmazásnál), valamint a Hozzáadás és beszúrás módokkal. Ezeknek a módszereknek a munkája teljesen azonos, és csak a visszatérési értékekben különbözik (az Add módszer visszatér a cache-hez hozzáadott objektumra).

Tekintsük az objektumgyorsítótár legegyszerűbb példáját. Az adatforrásból származó lekérdezés eredményét a gyorsítótárba helyezzük, és ezt az eredményt kinyomtatjuk az oldalra. Emellett információkat jelenítünk meg arról, hogy az eredmény hol van - a gyorsítótárból vagy az adatforrásból. Az alábbiakban a kezelő kódja látható az oldal eseményének betöltése esetén:

Ebben a példában a Cache objektummal való együttműködés nagyon hasonlít az Alkalmazás használatához. De egy jelentős különbséggel - mielőtt az objektumot a gyorsítótárból kapja, MINDIG ellenőrizze az objektum jelenlétét! Egy objektum elhelyezése a gyorsítótárban (még 2 másodperce is) nem garantálja, hogy ez az objektum még mindig ott van (ez a legfontosabb különbség a gyorsítótár és az alkalmazás között).

Az objektum implicit elhelyezése a gyorsítótárban a fenti példában megegyezik a következő hívással: Cache.Insert ("dataset", ds). De a Beszúrás módszernek 4 túlterhelt beállítása van, amellyel kezelheti az objektum tárolási szabályait a gyorsítótárban (végső soron ez a cél a cache létrejötte :)).

Tekintsük a következő példát. Az e-bolt honlapján számos oldalon megjelenik az értékesítési vezetőkkel kapcsolatos információk. Az információ forrása XML fájl, amely sok helyen megváltoztatható. Mivel gyakran szükséges az információkhoz való hozzáférés, jobb tárolni a gyorsítótárba. Nos, az adatok változásainak nyomon követése ugyanazt a gyorsítótárat tegye - a szolgáltatás előnyeit a Microsoft fejlesztői adták hozzá :) :)

A fájl változhatatlanságának ellenőrzésére a System.Web.Caching.CacheDependency osztály kerül felhasználásra. Ha ezt a funkciót hozzá kívánja adni a gyorsítótárba helyezett objektumhoz, létre kell hoznia egy példányt a CacheDependency osztályból és át kell adnia paraméterként a Cache.Insert módszerhez:

Most visszatérhetünk a példa végrehajtásához. A példa kódja az alábbiakban látható:

Az objektum gyorsítótárban történő tárolásának műveletének ellenőrzéséhez és törléséhez a fájl megváltoztatásakor hozzáadtam azt a kódot, amely adatokat ad az xml fájlhoz. Amikor először elindítja az oldalt, az adatok lekérdezhetők a fájlból, majd a cache-ból származó információkat fogják használni. Adatok hozzáadásakor nem hajt végre semmilyen speciális műveletet az objektum törléséhez a gyorsítótárból, de az adatmódosítás észlelhető és a gyorsítótárban tárolt objektum törlődik.

8. osztály System.Web.Caching.CacheDependency túlterhelt konstruktőrök, amellyel megadhatja a változások nyomon követése egy fájlt, egy könyvtár, egy listát a fájlok és könyvtárak, valamint a változások más tárgyak a cache (azaz az objektum lehet távolítani változásától függően az értéke egy másik objektum a gyorsítótárban) és a CacheDependency típusú másik objektumtól való függőség. Az összes fenti feltételhez beállíthatja az időtartamot, ahonnan ezeket a változtatásokat ellenőrizni kívánja. További információ a CahceDependency konstruktor összes túlterheléséről az MSDN-ben található.

Most tekintsünk egy másik adatgyorsító változatot. Ugyanazok az adatok, mint az előző példában, most nagyon aktívan változik. Ugyanakkor elfogadható a kimeneti adatok irreleváns (a hozzáférés sebessége mindenekelőtt). Ebben az esetben a legjobb algoritmus az lenne, ha bizonyos idő elteltével frissítené a cache-adatokat (például minden 5. percben). Ez a feladat ugyancsak lehetséges a gyorsítótár számára.

Az az időtartam, amely alatt az objektum a cache lehetnek abszolút (pontos telepítési idő, ami után a tárgy törlődik a cache) és a csúszó (tároló objektum megváltozik minden alkalommal az objektum elérését). Tekintsünk mindkét irányban:

Ebben a példában az adatobjektum 5 percig tárolódik a gyorsítótárban (ha az 1. vonalat használja) vagy 2 percet az objektum utolsó eléréséig (2. sor). Ebben a kódban is van egy példa arról, hogy egy objektum a cache-ban egy másiktól függ (a cache-ben tartja az aktuális időt, és megállapítja az objektum objektum függését az adatokkal). Ha módosítja az adatokat, akkor a tárolási idő lejártáig a gyorsítótárban lévő objektum nem lesz törölve. Ugyanakkor az adatok inkonzisztenciája természetesen előfordul, de ennek a feladatnak a feltételei szerint ez megengedett. Ez a módszer az adatok gyorsítótárazására (egy objektum tárolására a gyorsítótárban egy bizonyos ideig) a legmegfelelőbb az adatbázisokból tárolt objektumok gyorsítótárazása során. Sajnos a Microsoft fejlesztõi nem tették lehetõvé, hogy az adatforrás adatállapotában az objektumok függõségét beállítsák a cache-ben, bár ez bejelentették.

Szintén fontos megemlíteni egy fontos korlátot az objektum tárolási függőségének időben történő használatában - csak egy típusú idő használható egy objektumra. Szerelési objektum tárolására az abszolút időt a cache egy második paramétert kell System.Web.Caching.Cache.NoSlidingExpiration (vagy TimeSpan.Zero, hogy egy és ugyanaz). Ennek megfelelően, ha a tároló objektum gyorsítótárban lévő első csúszó idő paramétert egyenlő kell legyen System.Web.Caching.Cache.NoAbsoluteExpiration (vagy DateTime.MaxValue). Ha ez a feltétel nem teljesül, kivételt fognak adni.

Amint korábban említettem, a gyorsítótár képes kezelni a memóriát és törölni az objektumokat, amikor elérik a küszöbértéket. Az objektumok törlésére szolgáló eljárás algoritmusa el van rejtve a szemünktől, de van rá lehetőség, hogy némi hatással legyen rá. Ha objektumot ad hozzá a gyorsítótárhoz, akkor megadhatja az objektum tárhelyének prioritását (azaz az alacsonyabb prioritású objektumokat gyorsabban távolítja el a gyorsítótárból, mint a kiemelt objektumok). Megakadályozhatja, hogy az objektum törlődjön a gyorsítótárból.

Megadásához cache objektum tárolási prioritás használják System.Web.Caching.CacheItemPriority felsorolás a következő értékeket (emelkedő fontossági sorrendben): Alacsony, belownormal, Alap, Normál, AboveNormal, Nagy, NotRemovable. A CacheItemPriority.NotRemovable prioritással rendelkező gyorsítótárhoz hozzáadott objektum nem törlődik a gyorsítótár tisztításakor. Az utolsó olyan paraméter, amelyet a Beszúrás mód akkor tehet, amikor egy objektumot helyez el a gyorsítótárba, a System.Web.Caching.CacheItemRemovedCallback típusú. Ez a paraméter a küldött azon értékét veszi fel, amelyet az objektum törlése a gyorsítótárból hív. Eseménykezelőt hozhat létre például egy alkalmazás értesítésére, amikor egy objektumot eltávolít a gyorsítótárból.

Az előző példákhoz hasonlóan csak az érdeklődési kódot adjuk meg:

Nem mindig kényelmes várni, amíg az objektumot a hozzáadott szabályokból eltávolítják a gyorsítótárból. Például az adatbázis meglehetősen nagy frissítésével, jó lenne eltávolítani azokat a tárgyakat is, amelyek a régi adatokat tárolják a gyorsítótárból. Az objektumok eltávolításához a gyorsítótárból az Eltávolítási mód kerül alkalmazásra, amely egy paramétert tartalmaz - az objektum neve a gyorsítótárban.

Utolsó alkalmassága System.Web.Caching.Cache osztály, amelyhez szeretnénk felhívni a figyelmet, hogy a végrehajtás a IEnumerable interfész, amely gyors és kényelmes hozzáférést biztosít az összes tárolt objektumok cache alkalmazásokat.

Összefoglalva a fentieket, a következőket mondhatjuk: a Cache API helyes használata lehetővé teszi a webalkalmazás teljesítményének javítását (sok esetben - időnként). A gyorsítótár API kényelmes felületet biztosít az adatok tárolásához a gyorsítótárban, valamint az objektumok tárolási idejével kapcsolatos információkkal. Az adatforrásból ritkán változó adatok gyorsítótárban történő tárolásával drasztikusan csökkentheti az adatbázis-kiszolgáló terhelését és növelheti a válaszadási sebességet. De mint más hasonló esetekben, a Cache API használatát nem szabad visszaélni.

Kapcsolódó cikkek