2015-12-22 14 views
5

La nostra attuale implementazione della memorizzazione nella cache memorizza grandi quantità di dati negli oggetti del report (in alcuni casi 50 MB).Come memorizzare nella cache di oggetti di grandi dimensioni utilizzando la cache Redis

Abbiamo spostato dalla cache di memoria alla cache di file e utilizzare ProtoBuf per serializzare e de-serializzare. Funziona bene, ma ora stiamo sperimentando con la cache Redis. Di seguito è riportato un esempio di quanto tempo è necessario per Redis rispetto all'utilizzo del file system. (Nota: l'utilizzo di protobuf al posto di JsonConvert migliora il tempo impostato a 15 secondi e ottiene il tempo a 4 secondi nell'esempio seguente, quando si imposta un array di byte).

// Extremely SLOW – caching using Redis (JsonConvert to serialize/de-serialize) 
IDatabase cache = Connection.GetDatabase(); 

// 23 seconds! 
cache.StringSet("myKey", JsonConvert.SerializeObject(bigObject)); 

// 5 seconds! 
BigObject redisResult = JsonConvert.DeserializeObject<BigObject>(cache.StringGet("myKey")); 




// FAST - caching using file system (protobuf to serialize/de-serialize) 
IDataAccessCache fileCache = new DataAccessFileCache(); 

// .5 seconds 
fileCache.SetCache("myKey",bigObject); 

// .5 seconds           
BigObject fileResult = fileCache.GetCache<BigObject>("myKey");        

Grazie in anticipo per qualsiasi aiuto.

ps. Non ho trovato una risposta da simili domande poste. Caching large objects - LocalCache performance

o

Caching large objects, reducing impact of retrieval times

+1

È possibile separare la serializzazione dall'inserimento della cache per determinare che cosa consuma tempo? Probabilmente è la serializzazione di JSon. Prova un diverso metodo di serializzazione, ad esempio [BinaryFormatter] (https://msdn.microsoft.com/es-es/library/system.runtime.serialization.formatters.binary.binaryformatter%28v=vs.110%29.aspx?f= 255 & MSPPError = -2.147,217396 millions). – thepirat000

+0

Grazie per la rapida risposta. La serializzazione è solo di circa 1 secondo (dei 23). Quando siamo passati dalla memoria all'archiviazione dei file, abbiamo iniziato con BinaryFormatter, ma era "lento", quindi siamo passati a ProtoBuf. Darò un colpo. – Jon

+0

Quanto è grande l'oggetto serializzato? Hai provato la compressione? Ad esempio [Questo] (https://github.com/thepirat000/CachingFramework.Redis/blob/master/CachingFramework.Redis/Serializers/BinarySerializer.cs) – thepirat000

risposta

6

Redis realtà non è progettato per memorizzare oggetti di grandi dimensioni (molti MB) perché è un server a singolo filo. Quindi, una richiesta sarà abbastanza veloce, ma alcune richieste saranno lente perché saranno tutte elaborate da un thread. Nelle ultime versioni sono state fatte alcune ottimizzazioni.

La velocità della RAM e l'ampiezza di banda della memoria sembrano meno importanti per le prestazioni globali, in particolare per gli oggetti di piccole dimensioni. Per oggetti di grandi dimensioni (> 10 KB), tuttavia, potrebbe diventare evidente. Di solito, non è economicamente conveniente acquistare costosi moduli di memoria veloci per ottimizzare Redis. https://redis.io/topics/benchmarks

Quindi, è possibile utilizzare Jumbo frames o comprare una memoria più veloce se è possibile. Ma in realtà non aiuterà in modo significativo. Considera invece l'utilizzo di Memcached. È multi-thread e può essere ridimensionato orizzontalmente per supportare grandi quantità di dati. I redis possono essere ridimensionati solo con la replica master-slave.