webForumDet fria alternativet

Hur cachar man upp delar av databaser i minnet?

.NET

11 svar · 388 visningar · startad av asmodie

Medlem sedan jan. 2004501 inlägg
Frågan#1

Jag försöker dra upp prestandarden för mitt användarhanterings system för webben. Jag kodar ASP.NET med C#.

Jag undrar hur man kan cacha dataSet i minet för snabbare åtkomst för alla användare. Vilka kommandom man använder och hur man läser från minnet efter det att man laddat upp det.

Medlem sedan maj 20012 812 inlägg
#2

Du kan använda dig av objektet Cache. Läs på om det i hjälpfilerna.

Om du vill bli riktigt avancerad så kan du använda dig av MS Cache Application Block. Där kan du ställa in en massa parameters hur länge ett object skall vara kvar i cachen osv osv..

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp

- Magnus

Medlem sedan juni 20019 024 inlägg
#3

Först och främst välkommen till webForum!

Att cacha enstaka objekt är hur simpelt som helst:

VB
Cache("namn") = objekt.att.cacha
objekt = Cache("namn")

C#
Cache["namn"] = objekt.att.cacha;
objekt = Cache["namn"];

Läs mer här:
http://authors.aspalliance.com/aspxtreme/webapps/aspoutputcache.aspx

Medlem sedan jan. 2004501 inlägg
#4

Jag tackar så mycket för hjälpen. Ska ta och läsa igenom MS Cache Application Block...

Medlem sedan jan. 2004501 inlägg
#5

Gladh du får gjärna förklara för mig hur den cachar upp dataset i minnet?

Medlem sedan maj 20012 812 inlägg
#6

Gladh du får gjärna förklara för mig hur den cachar upp dataset i minnet?

Har faktiskt ingen anning eftersom jag aldrig använtt den, har skrivit en egen cache :)

Antar att man gör något sånt här.

CacheServer.Add(MyDataSet,"MittDataSet");

När man sedan vill hämta datan så gör man så här.

(DataSet)CacheServer["MittDataSet"];

Men detta är bara gissningar, garanterar dig att det står hur man skall göra i länken som du fick :)

- M

Medlem sedan sep. 20026 425 inlägg
#7

Gladh skrev:

...har skrivit en egen cache :)

Hur ser en sådan kodsnutt ut? Varför har du skrivit en egen? (Mjo, begränsningar i MS objekt kanske..?) Kan du inte posta lite kod här så att vi får se? :D

Medlem sedan maj 20012 812 inlägg
#8

Varför skrev jag en egen?
Tja.. erfarenhet, det är så man lär sig saker, samt att det var kul. :) Eftersom jag fått "inspiration" från MS Cache så är det nog inte begränsningar i den som spelar någon roll. Men visst jag kan ju bygga ut min hur jag vill.

Hur ser en sådan kodsnutt ut?
Det kan bli hur avancerat som helst. Men börja väldigt enkelt. De absoult enklast cachen som du kan göra är en HashTabel (vilket är grunden för de flesta cachar). Du i lagrar du ditt objekt och ett namn för objektet.

HashTable myCache = new HashTable();
myCache.Add("MittObject",MyObject);

Där har du en väldigt enkel cache :)

Oftas vill man ha lite mer funktioner, typ att man vill kunna bestämma att datan skall vara aktuell i en vistid. Det man gör då är att man skapar ett "cacheObject" som man lägger i sin HashTable. Det består av 2 parameters. Ett object och en DateTime.

CacheObject cObject = new CacheObject();
cObject.Object = myObject;
cObject.ValidTo = new DateTime(2004,01,27,12,00,00);

myCache.Add("MittObject",cObject);

Nu har du en tidpunkt när objectet inte skall vara gilltigt längre. Antingen är man nöjd med det och kontrollerar tiden när man skall hämta objectet eller så gör man en liten snurra som ligger och kontrollerar tiden på objecten i cachen med jämnamellanrum och plockar bort de som är för gammla.

Fungerar det?
Hmm.. sist jag provade så fick jag något mystiskt fel som jag inte orkat felsöka än :(

- Magnus

Medlem sedan sep. 20026 425 inlägg
#9

Tackar så mycket Magnus! Bra förklarat. :D

Medlem sedan jan. 2004501 inlägg
#10

Vart lägger man den koden om man vill att den ska köras så fort siten startas? Jag vill att vissa delar alltid ska finnas cachade i minnet oberoende vilken användare som är inne.

Medlem sedan juni 20011 732 inlägg
#11

Vart lägger man den koden om man vill att den ska köras så fort siten startas? Jag vill att vissa delar alltid ska finnas cachade i minnet oberoende vilken användare som är inne.

I global.asax: Application_Start.

Medlem sedan jan. 2004501 inlägg
#12

Trode det var det. Ville bara försäkra mig om det...

304 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
172 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)