sql >> Database >  >> NoSQL >> Redis

Azure Redis cache - meerdere fouten TimeoutException:time-out bij het uitvoeren van GET {key}

Een paar punten die onze situatie verbeterden:

Protobuf-net in plaats van BinaryFormatter

Ik raad aan om protobuf-net te gebruiken, omdat het de grootte van de waarden die je in je cache wilt opslaan, verkleint.

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

Implementeer strategie voor opnieuw proberen

Implementeer deze RedisCacheTransientErrorDetectionStrategy om time-outproblemen op te lossen.

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

Instantieer als volgt:

private readonly RetryPolicy _retryPolicy;

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

Gebruik als volgt:

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

Controleer uw code om cache-aanroepen en waarden die u in uw cache opslaat te minimaliseren. Ik heb veel fouten verminderd door waarden efficiënter op te slaan.

Als dit allemaal niet helpt. Ga naar een hogere cache (we hebben uiteindelijk C3 gebruikt in plaats van C1).



  1. HDFS-wiscodering in Big Data Hadoop

  2. MongoDB - De inhoud van een interne array filteren in een resultatenset

  3. MongoDB $ maand

  4. MongoDB $binarySize