sql >> Databasteknik >  >> NoSQL >> Redis

Azure Redis Cache - Flera fel TimeoutException:Timeout utför GET {nyckel}

Några punkter som förbättrade vår situation:

Protobuf-net istället för BinaryFormatter

Jag rekommenderar att du använder protobuf-net eftersom det kommer att minska storleken på värden som du vill lagra i din 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);
        }
    }

Implementera strategi för försök igen

Implementera denna RedisCacheTransientErrorDetectionStrategy för att hantera timeoutproblem.

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;
        }
    }

Instantiera så här:

private readonly RetryPolicy _retryPolicy;

// CODE
var retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(2));
            _retryPolicy = new RetryPolicy<RedisCacheTransientErrorDetectionStrategy>(retryStrategy);

Använd så här:

var cachedString = _retryPolicy.ExecuteAction(() => dataCache.StringGet(fullCacheKey));

Granska din kod för att minimera cache-anrop och värden som du lagrar i din cache. Jag minskade många fel genom att lagra värden mer effektivt.

Om inget av detta hjälper. Flytta till högre cache (det slutade med att vi använde C3 istället för C1).



  1. Hur man kontrollerar anslutningen till mongodb

  2. En säkerhetschecklista för MongoDB-produktionsinstallationer

  3. Kan jag göra två kolumner unika för varandra? eller använda sammansatta primärnycklar i redis?

  4. redis minne och cpu spikes