Einige Punkte, die unsere Situation verbessert haben:
Protobuf-net statt BinaryFormatter
Ich empfehle die Verwendung von protobuf-net, da dies die Größe der Werte reduziert, die Sie in Ihrem Cache speichern möchten.
public interface ICacheDataSerializer
{
byte[] Serialize(object o);
T Deserialize<T>(byte[] stream);
}
public class ProtobufNetSerializer : ICacheDataSerializer
{
public byte[] Serialize(object o)
{
using (var memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, o);
return memoryStream.ToArray();
}
}
public T Deserialize<T>(byte[] stream)
{
var memoryStream = new MemoryStream(stream);
return Serializer.Deserialize<T>(memoryStream);
}
}
Wiederholungsstrategie implementieren
Implementieren Sie diese RedisCacheTransientErrorDetectionStrategy, um Zeitüberschreitungsprobleme zu behandeln.
using Microsoft.Practices.TransientFaultHandling;
public class RedisCacheTransientErrorDetectionStrategy : ITransientErrorDetectionStrategy
{
/// <summary>
/// Custom Redis Transient Error Detenction Strategy must have been implemented to satisfy Redis exceptions.
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public bool IsTransient(Exception ex)
{
if (ex == null) return false;
if (ex is TimeoutException) return true;
if (ex is RedisServerException) return true;
if (ex is RedisException) return true;
if (ex.InnerException != null)
{
return IsTransient(ex.InnerException);
}
return false;
}
}
So instanziieren:
private readonly RetryPolicy _retryPolicy;
// CODE
var retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(2));
_retryPolicy = new RetryPolicy<RedisCacheTransientErrorDetectionStrategy>(retryStrategy);
Verwenden Sie wie folgt:
var cachedString = _retryPolicy.ExecuteAction(() => dataCache.StringGet(fullCacheKey));
Überprüfen Sie Ihren Code zum Minimieren von Cache-Aufrufen und Werten, die Sie in Ihrem Cache speichern. Ich habe viele Fehler reduziert, indem ich Werte effizienter gespeichert habe.
Wenn nichts davon hilft. Wechseln Sie zu einem höheren Cache (wir haben letztendlich C3 anstelle von C1 verwendet).