Avatar billede geekpower Nybegynder
16. juli 2007 - 16:48 Der er 11 kommentarer og
1 løsning

Tilføjelse til caching

Hejsa,
jeg er gået igang med at lege med caching.. Det fungerer fint med at cache en liste..

context.Cache.Insert("Cached", MinMetode(), null, DateTime.Now.AddMinutes(5), TimeSpan.Zero);

Så langt så godt.. Men når jeg nu tilføjer noget til min liste, hvordan får jeg så tilføjet dette til cachen..

I den overstående linie kode kan jeg bl.a. sætte en såkaldt dependensi ind i stedet for null - er det sårn noget man skal ud i og hvordan gør man så det ?

Eller skal man til at slette det cachede hver gang man skal tilføje noget til listen ?

Tak!
Avatar billede geekpower Nybegynder
16. juli 2007 - 17:11 #1
er der nogen vejledning for, hvornår man bør, og ikke bør, benytte caching.. Eller kan det altid betale sig ?
Avatar billede neoman Novice
16. juli 2007 - 17:59 #2
Hvis du køber den bog som blev anbefalet, så er der en ret god diskussion af caching, og de forskellige caching mekanismer (hvoraf nogle ikke er implementeret i BeerHouse) - ellers er der altid google.

Hvis du gemmer en "value-type" i cachen og efterfølgende ændrer den, så skal du opdatere cachen selv. Hvis du gemmer en "reference-type", så som en af de alskens lister, så vil efterfølgende ændringer i objektet slå igennem i cachen per automatik.
Avatar billede geekpower Nybegynder
16. juli 2007 - 18:08 #3
har jeg købt men der er 14 dage levering ;)

mkay så når jeg opdaterer objekterne i min liste så opdateres de automatisk i cachen ? men jeg skal slette den cachede liste når jeg har tilføjet et nyt objekt til listen ? Korrekt forstået :) ? husk at smid et svar :o
Avatar billede neoman Novice
16. juli 2007 - 18:30 #4
Når du cacher en reference type, så refererer både cache og din kode til samme stump memory. Hvis du ændrer noget i memory, så er det den samme ændring i cachen. Man kan jo ikke kalde det at "de opdateres i cachen", fordi der kun eksisterer en instance af dit objekt i det hele taget (så længe objektet er "reference type" .. hvilket er stort set alt andet end simple konstanter og variabler)

Følgende er sakset fra http://msdn2.microsoft.com/en-us/library/6hbbsfk6(VS.80).aspx

"The Cache object has no information about the content of the items it contains. It merely holds a reference to those objects. It also provides methods to track their dependencies and set expiration policies."
Avatar billede geekpower Nybegynder
16. juli 2007 - 18:33 #5
Nix en opdatering slår ikke igennem, hvad bør jeg så gøre ?
Avatar billede neoman Novice
16. juli 2007 - 18:35 #6
Vise noget kode :)
Avatar billede geekpower Nybegynder
16. juli 2007 - 18:41 #7
public static bool UpdateCategory(int id, string name)
    {
        SQLDataAccessLayer DALayer = new SQLDataAccessLayer();
        Category updateCategory = Category.GetCategoryByCategoryId(id);
        if (updateCategory != null)
        {
            //A litle cleanup in cache - is there a better way?
            //DeleteCache();

            updateCategory.Name = name;
            return DALayer.UpdateCategory(updateCategory);
        }
        else
            return false;
    }

Når listen over kategorier bliver vist, som er cached, så slår en ændring af kategoriens navn ikke igennem :)
Avatar billede neoman Novice
16. juli 2007 - 18:54 #8
Det kan jeg ikke bare sådan overskue, fordi der er andre lag jeg ikke kan se.

Jeg lavede en gang et lille script til at illustrere de ting. Det er godt nok VB men mon ikek du kan overskue det ? :) Og så bruger det session, men der burde ikke være nogen forskel med Cache i stedet for.

Har en gang lavet et lille script til test:
        Dim a As New ArrayList

        a.Add(1)
        a.Add(2)
        a.Add(3)

        Session("a") = a

        Dim b As New ArrayList
        b = CType(Session("a"), ArrayList)
        'fjerner sidste post i b
        b.RemoveAt(b.Count - 1)

        MsgBox(a.Count)

a.count = 2 og ej 3, fordi a og b begge peger på samme memory.
Avatar billede geekpower Nybegynder
16. juli 2007 - 19:11 #9
yeps så kan jeg fjerne et specifik objekt fra listen..

if (HttpContext.Current.Cache["GetAllCategories"] != null)
            {
                List<Category> categoryList = (List<Category>)HttpContext.Current.Cache["GetAllCategories"];
                categoryList.RemoveAt(categoryList.Count - 1);
            }

Men så er ideen at jeg, når jeg skal opdatere et objekt, fjerner den fra listen og så tilføjer den igen ?
Avatar billede neoman Novice
16. juli 2007 - 19:15 #10
Nope - det var blot et eksempel.

Jeg mener hvis du tilføjer et objekt til den cachede liste, så er objektet i listen, næste gang du retriever listen fra cachen.
Avatar billede geekpower Nybegynder
16. juli 2007 - 19:24 #11
Oh yes det var vist mit oprindelige spørgsmål :)

Jeg smider lige point, men vil da også gerne lige have et bonus svar på, hvad man så bør ved opdatering af data :)
Avatar billede neoman Novice
16. juli 2007 - 19:29 #12
Hvis du venter et par  dage, hehe .. jeg sidder og bakser på noget tilsvarende, men skal lige have noget design op at stå først:)  Men der kommer andre forbi her, helt sikkert :)

Jeg selv brygger på en prototype med datasets som jeg også cacher.. og efter de er cachet første gang, er alle efterfølgende ændringer i datasettene tilgængelige på alle siderne, uden nogen "opdatering" af cachen. Udfra dette, så skulle ændringer i de objekter, som er cachet een gang, være tilgængelige, så de ændrede objekter er dem som tilgås via cachen.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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