Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Azure Redis Cache – Mehrere Fehler TimeoutException:Zeitüberschreitung beim Ausführen von GET {key}

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).