Redis
 sql >> база данни >  >> NoSQL >> Redis

Azure Redis Cache – Множество грешки TimeoutException:Изчакване при изпълнение на GET {key}

Няколко точки, които подобриха положението ни:

Protobuf-net вместо BinaryFormatter

Препоръчвам да използвате protobuf-net, тъй като това ще намали размера на стойностите, които искате да съхранявате в кеша си.

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

Прегледайте кода си за да минимизирате извикванията към кеша и стойностите, които съхранявате във вашия кеш. Намалих много грешки, като съхранявах стойности по-ефективно.

Ако нищо от това не помогне. Преминете към по-висок кеш (в крайна сметка използвахме C3 вместо C1).



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Конвенция за именуване и валидни символи за ключ Redis

  2. Достъп до променлива извън redis конвейерна функция на Laravel

  3. Rails Redis задава maxmemory и maxmemory-policy

  4. zmq срещу redis за модел на pub-sub

  5. Работите с вложени обекти в Redis?