Folosind cache api

Când creați aplicații web, există adesea sarcini de cache pentru acces rapid la ele. În timpurile ASP, obiectul Cerere a fost utilizat pentru stocarea în memoria cache a datelor. Această abordare a dat un mod convenabil de a salva articole și acces la acestea din orice pagină web a aplicației, dar a efectuat, de asemenea, câteva probleme serioase, cum ar fi potențialul epuizarea memoriei disponibile, cu păstrarea activă a obiectelor din aplicație și problema de urmărire a acestor modificări și obiecte de actualizare cu date modificate.







Această problemă (folosind obiectul Application ca un cache al obiectelor) a fost dedicată unei mulțimi de discuții și articole despre monștri din clasicul ASP. Și, bineînțeles, această problemă nu a putut fi trecută cu vederea de către Microsoft la dezvoltarea ASP.NET. Și ca rezultat, a fost oferită o soluție simplă și elegantă.

În ASP.NET, pe lângă clasa HttpApplication, o clasă suplimentară HttpCache a fost introdusă în mod specific pentru a crea o cache de obiecte. Lucrul cu această clasă este foarte asemănător cu lucrul cu aplicația, dar există și diferențe semnificative. În primul rând, aceste diferențe vizează rezolvarea problemelor de mai sus:

  • Gestionarea memoriei - memoria cache poate șterge automat obiectele pentru depășirea depășirii memoriei.
  • Distrugerea obiectelor atunci când apare un eveniment - un obiect poate fi plasat într-o memorie cache cu reguli pentru eliminarea acestuia.
  • Apeluri apel invers - memoria cache acceptă capacitatea de a apela metode atunci când ștergeți obiecte din memoria cache.

Accesul la memoria cache se face prin proprietatea Cache a contextului aplicației web actuale. Puteți plasa obiecte în cache ca implicit (precum și cu aplicația) și cu metodele Adăugare și inserare. Lucrarea acestor metode este complet identică și diferă numai în valorile returnate (metoda Add adaugă o referință la obiectul adăugat în memoria cache).

Luați în considerare cel mai simplu exemplu de utilizare a unei cache de obiecte. Obținut din sursa de date, rezultatul interogării va fi pus în memoria cache și vom imprima acest rezultat pe pagină. De asemenea, vom afișa informații despre locul unde rezultatul este luat - din memoria cache sau din sursa de date. Mai jos este codul handlerului pentru evenimentul Load al paginii care efectuează aceste acțiuni:

În acest exemplu, lucrul cu obiectul Cache este foarte similar cu utilizarea aplicației. Dar, cu o diferență semnificativă - înainte de a obține obiectul din cache, ÎNTOTDEAUNA verificați prezența obiectului! Punerea unui obiect în memoria cache (chiar acum 2 secunde) nu garantează că acest obiect este încă acolo (aceasta este cea mai importantă diferență dintre Cache și aplicație).

Plasarea implicită a unui obiect în memoria cache din exemplul de mai sus este identică cu următorul apel: Cache.Insert ("dataset", ds). Dar metoda Insert are 4 opțiuni de încărcare, cu care puteți gestiona regulile pentru stocarea obiectului în memoria cache (la urma urmei, a fost creat pentru acest scop memoria cache :)).

Luați în considerare următorul exemplu. Pe site-ul magazinului electronic, pe mai multe pagini se afișează informații despre liderii de vânzări. Sursa acestor informații este un fișier XML, care poate fi schimbat în multe locuri. Întrucât accesul la aceste informații este adesea necesar, este mai bine să le stocați în memoria cache. Ei bine, urmărirea modificărilor datelor permite ca aceeași cache să facă - beneficiul acestei caracteristici a fost adăugat de dezvoltatorii de la Microsoft :).

Pentru a controla imutabilitatea fișierului, se folosește clasa System.Web.Caching.CacheDependency. Dacă doriți să adăugați această funcție la un obiect plasat în memoria cache, trebuie să creați o instanță a clasei CacheDependency și să o parcurgeți ca parametru în metoda Cache.Insert:

Acum putem reveni la implementarea exemplului. Codul pentru acest exemplu este prezentat mai jos:

Pentru a verifica operațiunea de stocare a obiectului în memoria cache și ao șterge la schimbarea fișierului, am adăugat și codul care adaugă date în fișierul xml. Când porniți prima pagină, datele vor fi preluate din fișier, iar informațiile din memoria cache vor fi utilizate. Când adăugăm date, nu efectuez acțiuni speciale pentru a șterge un obiect din memoria cache, dar modificarea datelor va fi detectată, iar obiectul stocat în memoria cache va fi șters.







Clasa 8 System.Web.Caching.CacheDependency a supraîncărcat constructori, cu care puteți specifica pista își schimbă un singur fișier, un director, o listă de fișiere și directoare, precum și modificările aduse altor obiecte în cache (de exemplu, obiectul poate fi îndepărtat în funcție de modificările valorii unui alt obiect în memoria cache) și dependența de un alt obiect al tipului CacheDependency. De asemenea, pentru toate condițiile de mai sus, puteți seta intervalul de timp în care doriți să monitorizați aceste modificări. Mai multe informații despre toate supraîncărcările constructorului CahceDependency pot fi găsite în MSDN.

Acum, ia în considerare o altă variantă de caching de date. Aceleași date ca și în exemplul precedent se schimbă acum în mod activ. În același timp, o anumită importanță a datelor de ieșire este acceptabilă (viteza de acces este mai presus de toate). Cel mai bun algoritm în acest caz ar fi actualizarea datelor din cache după o anumită perioadă de timp (de exemplu la fiecare 5 minute). Această sarcină este de asemenea posibilă pentru cache.

Perioada de timp în care obiectul va fi stocat în memoria cache poate fi fie absolut (ora exactă de instalare, după care obiectul va fi șters din memoria cache) și de alunecare (obiectul de stocare se modifică în fiecare acces în timp la obiect). Să luăm în considerare ambele moduri:

În acest exemplu, obiectul de date este plasat în cache timp de 5 minute (dacă utilizați linia 1) sau 2 minute de la ultimul acces la obiect (pentru linia 2). De asemenea, în acest cod există un exemplu despre modul în care un obiect din cache depinde de altul (păstrez timpul curent în memoria cache și stabilește dependența acestui obiect de obiect cu datele). Dacă modificați datele, obiectul din memoria cache nu va fi șters până la expirarea timpului de stocare. În același timp, inconsecvența datelor apare în mod natural, însă, conform condițiilor acestei sarcini, acest lucru este permis. Această metodă de stocare a datelor în cache (salvarea unui obiect în memoria cache pentru o anumită perioadă de timp) este cea mai bună metodă atunci când se cachează obiecte care stochează date din baze de date. Din păcate, dezvoltatorii Microsoft nu au făcut posibilă setarea dependențelor obiectelor din memoria cache de starea datelor din sursa de date, deși aceasta a fost anunțată.

De asemenea, este necesar să menționăm o limitare importantă în utilizarea dependenței de stocare a obiectelor față de timp - pentru un singur obiect poate fi folosit un singur tip de timp. Instalarea obiect stocarea timpului absolut în cache-ul unui al doilea parametru trebuie să fie System.Web.Caching.Cache.NoSlidingExpiration (sau TimeSpan.Zero, care sunt unul și același lucru). Prin urmare, prin utilizarea cache obiect de stocare primul parametru de alunecare timp trebuie să fie egal cu System.Web.Caching.Cache.NoAbsoluteExpiration (sau DateTime.MaxValue). Dacă această condiție nu este îndeplinită, va fi aruncată o excepție.

După cum am menționat mai devreme, cache-ul poate gestiona memoria în sine și poate șterge obiecte atunci când se atinge valoarea de prag. Algoritmul procedurii de ștergere a obiectelor este ascuns de ochii noștri, dar există o posibilitate de impact asupra ei. Când adăugați un obiect în memoria cache, este posibil să specificați prioritatea stocării obiectului (adică obiectele cu o prioritate mai mică vor fi șterse din cache mai repede decât obiectele cu prioritate ridicată). De asemenea, puteți preveni ștergerea obiectului din memoria cache.

Pentru a specifica o prioritate de stocare obiect din cache este utilizat System.Web.Caching.CacheItemPriority enumerare are următoarele valori (în ordine crescătoare a priorității): scăzut, BelowNormal, implicit, Normal, AboveNormal, de mare, NotRemovable. Obiect adăugat la cache-ul cu o CacheItemPriority.NotRemovable prioritate, nu vor fi eliminate atunci când curățarea cache vreodată. Ultimul parametru, care poate lua metoda Inserare când inserați un obiect în cache-ul este de tip System.Web.Caching.CacheItemRemovedCallback. Acest parametru ia valoarea delegatului care se numește atunci când obiectul este eliminat din memoria cache. Puteți crea un handler, de exemplu, pentru a notifica o aplicație despre modul de ștergere a unui obiect din memoria cache.

Ca și în exemplele anterioare, este prezentat numai codul de interes:

Nu este întotdeauna convenabil să așteptați până când obiectul este eliminat din cache prin regulile adăugate. De exemplu, cu o actualizare destul de mare a bazei de date, ar fi frumos să eliminați obiectele care stochează informații vechi din memoria cache. Pentru a elimina obiectele din memoria cache, se folosește metoda Remove, care necesită un parametru - numele obiectului în memoria cache.

Ultima clasa de funcționalitate System.Web.Caching.Cache la care ne-ar dori să atragă atenția este punerea în aplicare a interfeței IEnumerable, care oferă acces rapid și convenabil la toate obiectele stocate în memoria cache a aplicațiilor.

Rezumând toate cele de mai sus, putem spune următoarele - utilizarea corectă a API-ului Cache vă permite să îmbunătățiți performanța aplicației web (în multe cazuri - uneori). API-ul Cache oferă o interfață convenabilă pentru stocarea datelor în cache împreună cu informații despre timpul de stocare a obiectelor. Prin cache-ul de date care schimbă rareori date dintr-o sursă de date, puteți reduce drastic încărcarea serverului de baze de date și crește viteza de răspuns. Dar, ca și în alte cazuri similare, utilizarea API-ului Cache nu ar trebui să fie abuzată.







Articole similare

Trimiteți-le prietenilor: