Avatar billede cpmonster Nybegynder
16. februar 2005 - 16:10 Der 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.

Lad mig høre hvis i har nogle forslag.
Avatar billede a1a1 Novice
16. februar 2005 - 18:02 #1
du kan cache webservicen, næsten på samme måde som en .aspx fil

2 sek..
Avatar billede burningice Nybegynder
16. februar 2005 - 18:19 #2
hvis det er en webapplikation kan du altid få fat i Cache objectet gennem HttpContext.Current

Men hvis du ikke har brug for Callback-faciliteterne i Cache vil det næmmeste nok være at bruge Application-variablen.

HttpContext.Current.Request.Application["noget"] = dinDataTable;

og når du så skal hente den ud igen:

DataTable dt = (DataTable)HttpContext.Current.Request.Application["noget"];
Avatar billede a1a1 Novice
16. februar 2005 - 18:43 #3
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
Avatar billede a1a1 Novice
16. februar 2005 - 18:45 #4
jeg har slukket min sql server, men det virker stadig :o)
Avatar billede cpmonster Nybegynder
17. februar 2005 - 11:08 #5
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.
Avatar billede cpmonster Nybegynder
17. februar 2005 - 11:11 #6
Nu løste jeg det selv, men i var begge flinke til at svare. Så hvis i begge lige smider et svar så vi ljeg gerne acceptere jer for indsats!
Avatar billede cpmonster Nybegynder
17. februar 2005 - 11:47 #7
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.
Avatar billede a1a1 Novice
17. februar 2005 - 11:59 #8
det koster noget ram, men det burde ikke være noget problem for serveren hvis der da ikke er 100 andre websites på

;o)
Avatar billede cpmonster Nybegynder
17. februar 2005 - 12:11 #9
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?
Avatar billede a1a1 Novice
17. februar 2005 - 12:33 #10
jeg ved ikke om det bliver komprimeret, men det tror jeg ikke da det jo så ville koste ekstra cpu tid.

Men jeg tror at din egen "udregning" er fin, men det skal vel være max antal AKTIVE brugere.
Avatar billede burningice Nybegynder
17. februar 2005 - 13:05 #11
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.
Avatar billede arne_v Ekspert
17. februar 2005 - 23:06 #12
Det er nemt at gemme i en cache.

Det er ikke helt så nemt at expire fra Cache.
Avatar billede burningice Nybegynder
17. februar 2005 - 23:21 #13
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
Avatar billede cpmonster Nybegynder
19. februar 2005 - 00:16 #14
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
?? :)
Avatar billede burningice Nybegynder
21. februar 2005 - 09:44 #15
nej, ikke prioritering. Der er der en decideret CachePriority.

CacheDependency er når at et object f.eks. skal slettes når at en fil på harddisken bliver ændret/slettet/oprettet.
Avatar billede a1a1 Novice
21. februar 2005 - 17:13 #16
jeg fandt dette eksempel, i msdn ;o)

Dim CacheEnum As IDictionaryEnumerator = Cache.GetEnumerator()
While CacheEnum.MoveNext()
  cacheItem = Server.HtmlEncode(CacheEnum.Current.Value.ToString())
  Response.Write(cacheItem)
End While
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester