ASPNL logo (1 kb)
Saturday, February 04, 2012




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

Overzicht van caching in ASP.NET

Door Charles Carroll
16 januari 2002

ASP.net heeft een aantal bijzondere caching tools.

1a: De ASP manier van data caching

Nou...ASP heeft niet echt een voorbeeld maar sommige mensen (zoals ik) hebben zelf voorbeelden gemaakt, zoals: Worlds Fastest Listbox w/Application Data by Charles Carroll en
Worlds Fastest Listbox with XML, Application Variables

Maar deze waren erg primitief en de logica van het opmerken van updates werd lastig. En ze waren niet doorzichtig en makkelijk.

1b: ASP.NET Caching Tool #1: Output Caching

Het aardige van caching met ASP.NET is dat het gedaan kan worden zonder veranderingen op de pagina. Een simpel voorbeeld:

<%@ OutputCache duration="240" VaryByParam="None" %>

bovenaan een pagina zou betekenen dat pagina's HTML output onthouden wordt voor 4 minuten (240 seconden) zonder veranderingen in de pagina. De pagina kan 9 databases uitlezen, een andere website schrapen en veel meer.

Wanneer de eerste gebruiker de pagina opvraagt genereert ASP.NET de HTML. Als hierna een miljoen gebruikers de pagina bekijken in de volgende 3 minuten en 59 seconden, dan krijgen ze snel dezelfde HTML als de eerste bezoeker, zonder dat de HTML opnieuw gegenereerd wordt.

Je vraagt je misschien af "wat als mijn data verandert in die 4 minuten". Goede vraag. Hier komen "caching regels" in het spel. Ze kunnen ingesteld worden om bijvoorbeeld naar bestanden te kijken (dus. "als dit Access of XML bestand ooit verandert dan wordt de cache geinvalideerd"). Andere opties kun je vinden in ASP.NET Quickstart: Page Output Caching. Een voorbeeld om de aantal het database verkeer te beperken vind je in Page Output Caching by Charles Carroll.

ASP.NET ondersteunt zelfs:

  • Samenwerking tussen HTTP Handlers en ASP.NET pagina's die Booleans terugsturen, om een cache te invalideren
  • Het automatisch genereren van SQL Server 7/2000 triggers die de cache invalideren als er data in de database ingevoegd, gewijzigd, of verwijderd wordt

Maar mijn pagina bestaat uit veel stukjes code. Betekent dit dat geen enkele code wordt uitgevoerd als Output Caching aanstaat?
Zogenaamde fragment caching is ook mogelijk. Als een pagina database queries uitvoert, verschillende website schraapt, en verder wat gebruikerafhankelijke content bevat, dan kan de pagina in delen gecached worden. De database queries kunnen dan bijvoorbeeld 1 uur lang gecached worden, andere operaties 10 minuten lang, terwijl de gebruikafhankelijke gegevens niet gecached worden.

2: Mijn pagina is een search engine met veel parameters. Hij kan niet gecached worden....

Laten we zeggen dat je een database doorzoekt en de gebruiker geeft een aantal combinaties in (plaats of provincie via POST of GET). Natuurlijk valt het gebruik van caching hier dan te betwisten.

In tegendeel.
Als er geen code verandert op pagina niveau, dan maakt de output cache directive nieuwe caches en begint de klok voor elke POST/GET die binnenkomt onafhankelijk te tikken....

Als 50 mensen een bepaalde combinatie proberen, dan zal de cache gemaakt worden vanuit die combinatie. Als 3 mensen een andere combinatie proberen, dan wordt er een andere cache gemaakt die apart verloopt. Daarvoor is geen extra code nodig.

De "caching regels" ondersteunen zelfs "alleen cachen als de volgende combinatie zich voordoet X keer per Y interval". Bijvoorbeeld: "cache deze pagina alleen maar als deze pagina meer dan 20 keer per seconde wordt opgevraagd."

3: Een andere vorm van Caching

Elk cache onderdeel (zoals een object met business logica) dat is gemaakt door een ontwikkelaar kan in een applicatie cache geplaatst worden. Dit cache onderdeel zal waarschijnlijk bestaan als het opgevraagd wordt maar als het geheugen krap is, aangezien dit meestal meer vergt van een cache dan een string/output caching, kan het verwijderd worden.

Code die gebruik maakt van de cache zou moeten controleren of de cache leeg is en opnieuw aangemaakt moet worden, maar meestal zal de cache al bestaan.

Onderdelen die in de cache zijn geplaatst kunnen een gewicht gegeven worden zodat, als ASP.NET onderdelen moet verwijderen uit de cache om geheugen te behouden, het niet onderdelen verwijdert uit die cache die qua tijd duur zijn om opnieuw op te bouwen. Je kent je bronnen en knelpunten, dus deze hints die je aanlevert weerhouden het systeem ervan data te verwijderen die moeilijk opnieuw op te bouwen is.
ASP.NET Quickstart: Page Data Caching bevat alle detail.

4: Sessie en Applicatie Caches

Sessie en Applicatie data was niet de beste plaats om data te bewaren in ASP vanwege threading problemen
(zie:Databases and Sessions.... Just Say No! by Charles Carroll Global.asa Overkill by Charles Carroll)
en natuurlijk het gebrek aan webfarm support, het nodig zijn van cookies en het verdwijnen van sessie data.

Nu kan sessie data bewaard blijven ook al moet de server opnieuw opgestart worden. Een simpele instelling in web.config zorgt ervoor dat sessies worden opgeslagen in een back-end database (zoals SQL Server of Oracle) onzichtbaar voor de code en zonder pagina veranderingen. Anders verdwijnen sessies bij een timeout.

Sessies bestaan in alle machines in een webfarm
Sessies werken nu ook zonder cookies. Een simpele verandering in web.config (geen pagina veranderingen) zorgt ervoor dat het ASP.NET werker proces verzoeken begint te vertalen van bijvoorbeeld /folder/whatever.aspx naar /folder/#######/whatever.aspx. Daarin is #### een unieke id waaraan de sessie data van de gebruiker verbonden is. Geen pagina veranderingen en geen geknoei met GET of POST queries.

Natuurlijk zijn sessie en applicaties slechts enkele tools waarmee een programmeur hoge snelheid en schaalbaarheid kan verkrijgen. HTTP Handlers zullen je versteld doen staan. ISAPI snelheid/kracht en laag-niveau toegang.

Free-threaded modules zijn nu een kenmerk van alle code, zelfs als deze geschreven is met notepad. Dit betekent dat sessie/applicatie scope niet "gratis" is, maar de performance ook niet zal schaden. Om een idee te krijgen hoe makkelijk free-threaded en snelle code te schijven is, het schrijven van NT services is onbeduidend en free-threaded met Notepad en VB. Vergelijk: ASP.NET Quickstart: How Do I...Write a Simple Service Application? met de voorheen absurd moeilijke opdracht van het schrijven van een (buggy) service in VB of een ingewikkelde in C++.

© Charles Carroll (vertaling copyright ASPNL)

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL