Tyvärr när man arbetar med stora datamängder kommer det alltid att ta tid att serialisera och deserialisera strukturen. DataTable
Särskilt s är ganska komplexa objekt, eftersom de har rader och kolumner som ofta har mycket metadata kopplade till dem - även när det verkar vara en grundläggande tabell.
DataTable
vs List<POCO>
:
Fundera på om du verkligen behöver serialisera som en DataTable
. Kan du skapa en enklare POCO och serialisera en List<YourRecord>
? Med andra ord, om du inte behöver extra attribut på fält och kolumner och du kan serialisera till ett enklare format, är det sannolikt snabbare och mer utrymmeseffektivt i cachen; och återställ sedan till en DataTable
vid behov.
Ett annat alternativ är att dela upp DataTable
till mindre uppsättningar, som du serialiserar och lagrar i mindre delar. Du kanske tycker att detta fungerar bättre. Du bör kunna jämföra detta.
Riktmärke:
I slutändan bör din Redis-cache vara en förbättring jämfört med den tid det tar att återfråga datakällan. Du använder termen takes too much time
, men om det tar 2 sekunder att komma från cachen kontra 8 sekunder att fråga datakällan så är det en betydande ökning. Men det enda sättet att vara säker är att jämföra.
-
Ställ in din miljö så att du bara kör nödvändiga verktyg. Utför inte andra uppgifter medan du kör riktmärkena, så att du inte inför någon fördom.
-
Registrera den tid det tar att serialisera en
DataTable
. Utför denna åtgärd många gånger och i genomsnitt.var start = DateTime.Now; // Serialize var duration = DateTime.Now - start;
-
Experimentera med olika storlekar av
DataTable
s och se om du hittar en acceptabel tid. -
Prova ett annat serialiseringsbibliotek, som JSON.NET. Även om det är trevligt att behålla allt ServiceStack, kan detta hjälpa dig att avgöra om det är en brist i ServiceStack.Text eller bara ett problem med den stora datamängden.
-
Upprepa processen för deserialisering.
Minne:
Om du arbetar med stora datamängder, har både din applikation och cachen tillräckligt med minne? Minnet i din ansökan kan vara en flaskhals; Du bör titta på systemets aktivitetsövervakare medan du utför operationerna och se till att du inte får ont om minne och att ditt system ska utföra personsökning. Om du upptäcker att detta händer, överväg antingen att öka RAM-minnet eller dela upp datatabellen i mindre datauppsättningar som nämnts tidigare.
Latens:
Om du ansluter till en Redis-server över ett nätverk, och inte på samma maskin, har du kontrollerat nätverkets latens? Du kanske vill pinga din mellan din applikationsserver och cacheservern och se till att du faktiskt har en låg ping. Särskilt om du upptäcker att cachelagring av enkla objekt går långsamt.
Redis?
Om du upptäcker att det inte finns något sätt att förbättra tiden för att cache och återställa, kanske det inte passar att använda Redis. Kanske använder en static DataTable
inom applikationsminnet skulle vara lämpligare. Med andra ord, genom att behålla cachen i applikationsminnet och sedan finns det ingen serialisering och deserialisering att oroa sig för. Naturligtvis kan du behöva vara försiktig med att se till att du har tillräckligt med minne tillgängligt för din applikation för att göra detta. Jag skulle dock bli förvånad om du var tvungen att välja det här alternativet .
Sammanfattning:
Utan att se din datauppsättning eller kunskap om tjänsten du bygger är det i slutändan bara generiska råd om hur du bäst kan begränsa orsaken till ditt problem. Det viktigaste tipset är att inte använda en DataTable
om en enklare struktur duger, och jämför var och en av operationerna för att fastställa eventuella flaskhalsar.
Jag hoppas att detta hjälper.