16. februar 2005 - 16:10Der er
14 kommentarer og 2 løsninger
Hvordan bruger jeg Cache objektet .NET
Hej
Jeg har en webplatform med en bagliggende datakonponent, der står for databasekald osv., komponenten læser også data via en Webservice et andet geografisk sted i landet.
Ok, nu kunne det jo være interessant hvis jeg kunne cache det data der hentes over webservicen så ikke brugeren skal vente på det hver eneste gang.
Jeg forestiller mig at hvis parametrene er uændrede i Funktionskaldet (brugerid), så skal den kigge i cache og ikke lege med sæben (SOAP :)
Al data fra Webservicen gemmer jeg i et datatable, så jeg forestiller noget i denne retning:
dim c as cache = Dataset("table") 'Skyder i tågen her!
Jeg ved ikke helt i hvilken retning jeg skal bevæge mig i, så hvis i har noget jeg kan arbejde mig ud fra: Et eksempel, en template osv, ville jeg blive utrolig tilfreds.
Jeg har fundet enkelte eksempler på System.Web.Caching.Cache, men jeg er ret sikker på den ikke virker i en VB.net komponent, det det rent teknisk set ikke foregår på en webside men i en .NET komponent. Dette er nok også gældende ved brug af viewstate objektet.
Det her virker, dog med en arraylist istedet for et dataset men der er ikke nogen forskel (cacher i 20 minuter, siden sidste access, ala session timeout)
Session("user") = 1
Dim ws As New ws.customerws Dim arr As ws.customer() If Cache.Item(Session("user").ToString) Is Nothing Then Dim oldarr As ws.customer() oldarr = ws.GetCustomers Dim absexpire As DateTime = DateTime.MaxValue Dim tspan As New TimeSpan(0, 0, 20, 0, 0) Cache.Insert(Session("user").ToString, oldarr, Nothing, absexpire, tspan) arr = oldarr Else arr = CType(Cache.Get(Session("user").ToString), ws.customer()) End If ws.Dispose() ws = Nothing
Hæ.. Jeg fandt faktisk ud af det senere selv og I har ganske ret..
If Not context.Cache.Get(LoginTicket) Then ds = CType(context.Cache.Get(LoginTicket), [dsSchema]) Else ds = ..ADO.NET..... context.Cache.Add(loginTicket, ds, Nothing, DateTime.Now.AddSeconds(10), System.TimeSpan.Zero, Web.Caching.CacheItemPriority.Normal, Nothing) End IF
Meget simpelt og Uhyre effektivt! Jeg gik fra datakald på 2-3 sekunder til under 0,1 sekund.. Det er sq noget der kan mærkes.
Det er jo totalt sejt at den er ligeglad med hvilket object jeg vil cache. JEg bruger her mit eget customdataset, fuldstændig ligeglad er den.
Jeg prøvede først at cahce hele resultatet fra Webservicen, det gav heller ingen problemer. Og det er vel og mærke et objeckt-opbygget svar jeg modtager, oprettet og Soap'et (XML) fra et Java miljø, så den eneste standard fulgt er vel soap.
2 linier kode: Flere hundrede procent performanceforbedring.
[Ind i mellem tænker de sig om hos M*crosoft.]
Nu er jeg kun spændt på om systemet kan klare det i Produktion, der er trods alt 5-6000 Page imp. pr. dag.
Men hvordan skal jeg regne her, for at lave et estimat på hardwarekrav?
Skal jeg sige hele Xml resultatet i bytes gange antallet af brugere og så må det helst ikke overstige de frie MB ram der er tilrådighed? eller kan jeg forvente en eller anden pakke funktion af objektet før den skriver til hukommelsen?
hvis det er et problem smider du bare nogle flere ram i maskinen... ram koster jo ikke noget nu om dage.
Om de tænker sig om hos MS... jeg mener, der er ikke nogen stor videnskab at lave en cache-funktionalitet. Objectet findes jo allerede i hukommelsen, så det eneste man skal gøre er at gemme adressen til objectet for at det ikke skal blive slettet af Garbage Collecteren.
en table med tidspunkter hvornår et object skal slettes og evt. callback delegate og en timer der kører med et fast interval burde vel kunne klare det med expire.
Der hvor Cache bliver rigtig kraftfuldt er når man begynder at arbejde med CacheDependency
Cyber: CacheDependency kiggede jeg lidt på, her er det vel prioritering? Jeg tror det kunne blive interessant i et miljø som det jeg her har gang i. Noget af den data jeg skal gemme skal måske skrottes til fordel for andet.
Du har haft nogle gode erfaringer? :)
a1: Helt sikkert kun aktive brugere. Jeg har dog lidt svært ved at vurdere ud fra vores statistik, som jo som de fleste logreaders, bruger PageImpressions og ikke unikke brugere som sammentælling.
Så jeg kunne egentlig godt tænke mig at vide om jeg kan "se" hvor mange cache objekter jeg har kørende på et givent tidspunkt, så jeg kan se effekten på systemet. Det er vel noget med:
For each [element] in context.Cache bla bla. += 1 Next ?? :)
Dim CacheEnum As IDictionaryEnumerator = Cache.GetEnumerator() While CacheEnum.MoveNext() cacheItem = Server.HtmlEncode(CacheEnum.Current.Value.ToString()) Response.Write(cacheItem) End While
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.