sql >> Database >  >> NoSQL >> Redis

Wat is de meest tijdbesparende manier om een ​​datatabel te serialiseren/deserialiseren van/naar Redis?

Helaas zal het bij het werken met grote datasets altijd tijd kosten om de structuur te serialiseren en te deserialiseren. DataTable Vooral s zijn vrij complexe objecten, omdat ze rijen en kolommen hebben waaraan vaak veel metagegevens zijn gekoppeld - zelfs als het een eenvoudige tabel lijkt te zijn.

DataTable vs List<POCO> :

Overweeg of u echt moet serialiseren als een DataTable . Kunt u een eenvoudigere POCO maken en een List<YourRecord> serialiseren? ? Met andere woorden, als je geen extra attributen op velden en kolommen nodig hebt en je kunt serialiseren naar een eenvoudiger formaat, dan is het waarschijnlijk sneller en meer ruimtebesparend in de cache; en herstel vervolgens naar een DataTable indien nodig.

Een andere optie is om de DataTable te splitsen in kleinere sets, die u serialiseert en in kleinere delen opslaat. Misschien vind je dit performanter. Je zou dit moeten kunnen benchmarken.

Benchmark:

Uiteindelijk zou uw Redis-cache een verbetering moeten zijn ten opzichte van de tijd die nodig is om de gegevensbron opnieuw op te vragen. Je gebruikt de term takes too much time , maar als het 2 seconden duurt om uit de cache te komen versus 8 seconden om de gegevensbron op te vragen, dan is dat een aanzienlijke boost. Maar de enige manier om zeker te zijn, is door te benchmarken.

  • Stel uw omgeving zo in dat u alleen noodzakelijke tools gebruikt. Voer geen andere taken uit terwijl u de benchmarks uitvoert, zodat u geen vooringenomenheid introduceert.

  • Noteer de tijd die nodig is om een ​​DataTable te serialiseren . Voer deze actie vaak en gemiddeld uit.

    var start = DateTime.Now;
    // Serialize
    var duration = DateTime.Now - start;
    
  • Experimenteer met verschillende formaten van DataTable s en kijk of je een acceptabele tijd vindt.

  • Probeer een andere serialisatiebibliotheek, zoals JSON.NET. Hoewel het leuk is om het allemaal ServiceStack te houden, kan dit je helpen te bepalen of het een tekortkoming van ServiceStack.Text is of gewoon een probleem met de grote dataset.

  • Herhaal het proces voor deserialisatie.

Geheugen:

Als je met grote datasets werkt, hebben zowel je applicatie als de cache voldoende geheugen? Het geheugen in uw applicatie kan een knelpunt zijn; U moet de activiteitenmonitor van uw systeem in de gaten houden terwijl u de bewerkingen uitvoert, en ervoor zorgen dat u niet te weinig geheugen heeft en dat uw systeem paging uitvoert. Als je merkt dat dit gebeurt, overweeg dan om het RAM-geheugen te vergroten of de DataTable op te splitsen in kleinere datasets, zoals eerder vermeld.

Latentie:

Als u verbinding maakt met een Redis-server via een netwerk en niet op dezelfde machine, heeft u dan de latentie van het netwerk gecontroleerd? Misschien wilt u uw ping tussen uw toepassingsserver en de cacheserver pingen en ervoor zorgen dat u een lage ping heeft. Vooral als je merkt dat het cachen van eenvoudige objecten traag is.

Opnieuw?

Als je merkt dat er geen manier is om de tijd voor cachen en herstellen te verbeteren, dan is het misschien niet geschikt om Redis te gebruiken. Misschien met behulp van een static DataTable binnen het toepassingsgeheugen zou meer geschikt zijn. Met andere woorden, door de cache in het toepassingsgeheugen te houden, hoeft u zich geen zorgen te maken over serialisatie en deserialisatie. Het kan natuurlijk zijn dat u voorzichtig moet zijn om ervoor te zorgen dat u voldoende geheugen beschikbaar heeft voor uw toepassing om dit te doen. Het zou me echter verbazen als je deze optie zou moeten kiezen .

Samenvatting:

Zonder uw dataset te zien of kennis te hebben van de service die u aan het bouwen bent, is het uiteindelijk slechts generiek advies over hoe u de oorzaak van uw probleem het beste kunt achterhalen. Het belangrijkste advies is:gebruik geen DataTable of een eenvoudigere structuur volstaat, en benchmark elk van de operaties om eventuele knelpunten te bepalen.

Ik hoop dat dit helpt.




  1. SSL-connectiviteit met Redis met StackExchange.Redis

  2. node redis, variabelen worden gedeeld tussen clients?

  3. Pymongo / MongoDB:index aanmaken of index verzekeren?

  4. Als Redis single Threaded is, hoe kan het dan zo snel zijn?