Beberapa poin yang memperbaiki situasi kami:
Protobuf-net bukan BinaryFormatter
Saya sarankan menggunakan protobuf-net karena akan mengurangi ukuran nilai yang ingin Anda simpan di cache.
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);
}
}
Terapkan strategi coba lagi
Terapkan RedisCacheTransientErrorDetectionStrategy ini untuk menangani masalah waktu tunggu.
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;
}
}
Buat instance seperti ini:
private readonly RetryPolicy _retryPolicy;
// CODE
var retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(2));
_retryPolicy = new RetryPolicy<RedisCacheTransientErrorDetectionStrategy>(retryStrategy);
Gunakan seperti ini:
var cachedString = _retryPolicy.ExecuteAction(() => dataCache.StringGet(fullCacheKey));
Tinjau kode Anda untuk meminimalkan panggilan cache dan nilai yang Anda simpan di cache. Saya mengurangi banyak kesalahan dengan menyimpan nilai secara lebih efisien.
Jika tidak ada yang membantu. Pindah ke cache yang lebih tinggi (kami akhirnya menggunakan C3, bukan C1).