2015-12-22 17 views
5

現在のキャッシング実装では、レポートオブジェクトに大量のデータをキャッシュします(場合によっては50MB)。Redisキャッシュを使用してラージオブジェクトをキャッシュする方法

メモリキャッシュからファイルキャッシュに移動し、ProtoBufを使用してシリアライズおよびデシリアライズしました。これはうまくいきますが、Redisのキャッシュを試しています。 以下は、ファイルシステムを使用する場合よりもRedisにかかる時間の例です。 (注:JsonConvertの代わりにprotobufを使用すると、設定時間が15秒に短縮され、バイト配列を設定する場合、以下の例では4秒になります)。

// 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");        

ご協力いただきありがとうございます。

ps。私は尋ねられた同様の質問から答えを見つけませんでした。 Caching large objects - LocalCache performance

又は

Caching large objects, reducing impact of retrieval times

+1

シリアライズをキャッシュ挿入から分離して、消費時間を判断できますか?それはおそらくJSonのシリアル化です。別のシリアル化メソッド、[BinaryFormatter]を試してください(https://msdn.microsoft.com/es-es/library/system.runtime.serialization.formatters.binary.binaryformatter%28v=vs.110%29.aspx?f= 255&MSPPError = -2147217396)。 – thepirat000

+0

迅速な対応に感謝します。シリアライゼーションは(23の)約1秒です。私たちがメモリからファイルストレージに移動したとき、BinaryFormatterを使い始めましたが、それは「遅い」ので、ProtoBufに切り替えました。私はそれを撃つだろう。 – Jon

+0

オブジェクトのシリアライズはどのくらいですか?あなたは圧縮を試みましたか?すなわち[This](https://github.com/thepirat000/CachingFramework.Redis/blob/master/CachingFramework.Redis/Serializers/BinarySerializer.cs) – thepirat000

答えて

6

それはシングルスレッド・サーバであるため、実際にはラージオブジェクト(多くのMB)を格納するために設計されていないのRedis。したがって、1つのリクエストは十分に高速ですが、1つのスレッドですべて処理されるため、リクエストが遅くなります。最後のバージョンでは、いくつかの最適化が行われました。

RAMとメモリ帯域幅の速度は、特に小規模なオブジェクトのグローバルパフォーマンスにとってあまり重要ではないようです。大きなオブジェクト(> 10 KB)の場合、目立つようになることがあります。 Redisを最適化するために、高価な高速メモリモジュールを購入するのは、通常、コスト効率のよい方法ではありません。 https://redis.io/topics/benchmarks

したがって、可能であればジャンボフレームを使用したり、より高速なメモリを購入したりすることができます。しかし、実際にはそれは大きく助けにならないでしょう。 代わりにMemcachedの使用を検討してください。これはマルチスレッドであり、大量のデータをサポートするために水平方向にスケールアウトすることができます。 Redisは、マスター/スレーブの複製でのみスケーリングできます。

関連する問題