Redis
 sql >> Database >  >> NoSQL >> Redis

Qual è il modo più efficiente in termini di tempo per serializzare/deserializzare un DataTable su/da Redis?

Sfortunatamente, quando si lavora con set di dati di grandi dimensioni, ci vorrà sempre del tempo per serializzare e deserializzare la struttura. DataTable I messaggi in particolare sono oggetti abbastanza complessi, poiché hanno righe e colonne a cui spesso sono allegati molti metadati, anche quando sembra essere una tabella di base.

DataTable vs List<POCO> :

Considera se è davvero necessario serializzare come DataTable . Potresti creare un POCO più semplice e serializzare un List<YourRecord> ? In altre parole, se non hai bisogno di attributi aggiuntivi su campi e colonne e puoi serializzare in un formato più semplice, è probabilmente più veloce e più efficiente in termini di spazio nella cache; e quindi ripristinare in una DataTable se necessario.

Un'altra opzione è dividere la DataTable in set più piccoli, che serializzi e memorizzi in parti più piccole. Potresti trovarlo più performante. Dovresti essere in grado di effettuare un benchmark.

Parametro:

In definitiva, la tua cache Redis dovrebbe essere un miglioramento nel tempo impiegato per eseguire nuovamente la query sull'origine dati. Usi il termine takes too much time , ma se sono necessari 2 secondi per ottenere dalla cache rispetto a 8 secondi per eseguire una query sull'origine dati, si tratta di un aumento significativo. Ma l'unico modo per essere sicuri è fare un benchmark.

  • Configura il tuo ambiente in modo da eseguire solo gli strumenti necessari. Non eseguire altre attività durante l'esecuzione dei benchmark, in modo da non introdurre alcuna distorsione.

  • Registra il tempo necessario per serializzare una DataTable . Esegui questa azione molte volte e nella media.

    var start = DateTime.Now;
    // Serialize
    var duration = DateTime.Now - start;
    
  • Sperimenta con diverse dimensioni di DataTable se trovi un orario accettabile.

  • Prova una libreria di serializzazione diversa, come JSON.NET. Anche se è bello mantenere tutto ServiceStack, questo può aiutarti a determinare se si tratta di un difetto di ServiceStack.Text o solo di un problema con l'ampio set di dati.

  • Ripetere il processo per la deserializzazione.

Memoria:

Se stai lavorando con set di dati di grandi dimensioni, sia la tua applicazione che la cache hanno memoria sufficiente? La memoria nell'applicazione potrebbe essere un collo di bottiglia; Dovresti guardare il monitoraggio dell'attività del tuo sistema durante l'esecuzione delle operazioni e assicurarti di non esaurire la memoria e di fare in modo che il tuo sistema esegua il paging. Se ritieni che ciò accada, considera di aumentare la RAM o di dividere DataTable in set di dati più piccoli come menzionato prima.

Latenza:

Se ti stai connettendo a un server Redis su una rete e non sulla stessa macchina, hai controllato la latenza della rete? Potresti voler eseguire il ping tra il tuo server delle applicazioni e il server della cache e assicurarti di avere effettivamente un ping basso. Soprattutto se trovi che la memorizzazione nella cache di oggetti semplici è lenta.

Redis?

Se stai scoprendo che non c'è modo di migliorare il tempo per memorizzare nella cache e ripristinare, forse l'uso di Redis non è adatto. Forse usando una static DataTable all'interno della memoria dell'applicazione sarebbe più adatto. In altre parole, mantenendo la cache nella memoria dell'applicazione e quindi non ci sono serializzazione e deserializzazione di cui preoccuparsi. Ovviamente potrebbe essere necessario fare attenzione a garantire di avere abbastanza memoria disponibile per l'applicazione per farlo. Sarei comunque sorpreso se dovessi scegliere questa opzione però .

Riepilogo:

Senza vedere il tuo set di dati o conoscere il servizio che stai costruendo, in definitiva è solo un consiglio generico su come restringere al meglio la causa del tuo problema. Il consiglio chiave è di non utilizzare una DataTable se va bene una struttura più semplice, e confrontare ciascuna delle operazioni per determinare eventuali colli di bottiglia.

Spero che questo aiuti.