कुछ बिंदु जिन्होंने हमारी स्थिति में सुधार किया:
बाइनरीफॉर्मेटर के बजाय प्रोटोबफ-नेट
मैं प्रोटोबफ-नेट का उपयोग करने की सलाह देता हूं क्योंकि यह उन मानों के आकार को कम कर देगा जिन्हें आप अपने कैश में संग्रहीत करना चाहते हैं।
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);
}
}
पुन:प्रयास की रणनीति लागू करें
टाइमआउट मुद्दों को संभालने के लिए इस RedisCacheTransientErrorDetectionStrategy को लागू करें।
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;
}
}
इस तरह त्वरित करें:
private readonly RetryPolicy _retryPolicy;
// CODE
var retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(2));
_retryPolicy = new RetryPolicy<RedisCacheTransientErrorDetectionStrategy>(retryStrategy);
इस तरह प्रयोग करें:
var cachedString = _retryPolicy.ExecuteAction(() => dataCache.StringGet(fullCacheKey));
अपना कोड देखें कैश कॉल और मूल्यों को कम करने के लिए जिन्हें आप अपने कैश में संग्रहीत कर रहे हैं। मैंने मूल्यों को अधिक कुशलता से संग्रहीत करके बहुत सी त्रुटियों को कम किया।
अगर इनमें से कोई भी मदद नहीं करता है। उच्चतर कैश में ले जाएँ (हमने C1 के बजाय C3 का उपयोग करना समाप्त कर दिया)।