Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Azure Redis Cache - Nhiều lỗi TimeoutException:Timeout thực hiện GET {key}

Một số điểm đã cải thiện tình hình của chúng tôi:

Protobuf-net thay vì BinaryFormatter

Tôi khuyên bạn nên sử dụng protobuf-net vì nó sẽ giảm kích thước của các giá trị mà bạn muốn lưu trữ trong bộ nhớ cache của mình.

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

Thực hiện chiến lược thử lại

Triển khai RedisCacheTransientErrorDetectionStrategy này để xử lý các vấn đề về thời gian chờ.

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

Khởi tạo như thế này:

private readonly RetryPolicy _retryPolicy;

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

Sử dụng như thế này:

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

Xem lại mã của bạn để giảm thiểu các cuộc gọi và giá trị trong bộ nhớ cache mà bạn đang lưu trữ trong bộ nhớ cache của mình. Tôi đã giảm nhiều lỗi bằng cách lưu trữ các giá trị hiệu quả hơn.

Nếu không có điều này sẽ giúp. Di chuyển đến bộ nhớ đệm cao hơn (cuối cùng chúng tôi đã sử dụng C3 thay vì C1).



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để sử dụng sadd với nhiều phần tử trong Redis bằng Python API?

  2. ServiceStack.Net Redis:Lưu trữ các đối tượng liên quan so với id đối tượng liên quan

  3. Làm thế nào để kết nối an toàn với Heroku Redis thông qua dòng lệnh?

  4. Bảng quản trị Redis

  5. Thực hiện song song với StackExchange.Redis?