Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Azure Redis Cache - Beberapa kesalahan TimeoutException:Timeout melakukan GET {key}

Beberapa poin yang memperbaiki situasi kami:

Protobuf-net bukan BinaryFormatter

Saya sarankan menggunakan protobuf-net karena akan mengurangi ukuran nilai yang ingin Anda simpan di 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);
        }
    }

Terapkan strategi coba lagi

Terapkan RedisCacheTransientErrorDetectionStrategy ini untuk menangani masalah waktu tunggu.

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

Buat instance seperti ini:

private readonly RetryPolicy _retryPolicy;

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

Gunakan seperti ini:

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

Tinjau kode Anda untuk meminimalkan panggilan cache dan nilai yang Anda simpan di cache. Saya mengurangi banyak kesalahan dengan menyimpan nilai secara lebih efisien.

Jika tidak ada yang membantu. Pindah ke cache yang lebih tinggi (kami akhirnya menggunakan C3, bukan C1).



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengatur jalur dinamis di redis.conf menggunakan variabel Lingkungan

  2. Cache dalam memori dengan masa berlaku LRU

  3. Redis Hash Pagination

  4. Bagaimana Mendaftar Semua Basis Data Redis?

  5. Cara Mengatur Yii2 Dengan Konfigurasi Redis