title: StackExchange.Redis with Azure Redis is unusably slow or throws timeout errors
body: <p>I'm moving all of my existing Azure In-Role cache use to Redis and decided to use the Azure Redis preview along with the StackExchange.Redis library (<a href="https://github.com/StackExchange/StackExchange.Redis" rel="noreferrer">https://github.com/StackExchange/StackExchange.Redis</a>).  I wrote all the code for it without much problem, but when running it is absolutely unusably slow and constantly throws timeout errors (my timeout period is set to 15 seconds).</p>
  
  <p>Here is the relevant code for how I am setting up the Redis connection and using it for simple operations:</p>
  
  <pre><code>    private static ConnectionMultiplexer _cacheService;
      private static IDatabase _database;
      private static object _lock = new object();
  
      private void Initialize()
      {
          if (_cacheService == null)
          {
              lock (_lock)
              {
                  if (_cacheService == null)
                  {
                      var options = new ConfigurationOptions();
                      options.EndPoints.Add("{my url}", 6380);
                      options.Ssl = true;
                      options.Password = "my password";
                      // needed for FLUSHDB command
                      options.AllowAdmin = true;
  
                      // necessary?
                      options.KeepAlive = 30;
                      options.ConnectTimeout = 15000;
                      options.SyncTimeout = 15000;
  
                      int database = 0;
  
                      _cacheService = ConnectionMultiplexer.Connect(options);
                      _database = _cacheService.GetDatabase(database);
                  }
              }
          }
  
      }
  
      public void Set(string key, object data, TimeSpan? expiry = null)
      {
          if (_database != null)
          {
              _database.Set(key, data, expiry: expiry);
          }
      }
  
      public object Get(string key)
      {
          if (_database != null)
          {
              return _database.Get(key);
          }
          return null;
      }
  </code></pre>
  
  <p>Performing very simple commands like Get and Set often time out or take 5-10 seconds to complete.  Seems like it kind of negates the whole purpose of using it as a cache if it's WAY slower than actually fetching the real data from my database :)</p>
  
  <p>Am I doing anything obviously incorrect?</p>
  
  <p><strong>Edit</strong>: here are some stats that I pulled from the server (using Redis Desktop Manager) in case that sheds some light on anything.</p>
  
  <pre><code>Server
  redis_version:2.8.12
  redis_mode:standalone
  os:Windows  
  arch_bits:64
  multiplexing_api:winsock_IOCP
  gcc_version:0.0.0
  process_id:2876
  
  tcp_port:6379
  uptime_in_seconds:109909
  uptime_in_days:1
  hz:10
  lru_clock:16072421
  config_file:C:\Resources\directory\xxxx.Kernel.localStore\1\redis_2092_port6379.conf
  
  Clients
  connected_clients:5
  client_longest_output_list:0
  client_biggest_input_buf:0
  client_total_writes_outstanding:0
  client_total_sent_bytes_outstanding:0
  blocked_clients:0
  
  Memory
  used_memory:4256488
  used_memory_human:4.06M
  used_memory_rss:67108864
  used_memory_rss_human:64.00M
  used_memory_peak:5469760
  used_memory_peak_human:5.22M
  used_memory_lua:33792
  mem_fragmentation_ratio:15.77
  mem_allocator:dlmalloc-2.8
  
  Persistence
  loading:0
  rdb_changes_since_last_save:72465
  rdb_bgsave_in_progress:0
  rdb_last_save_time:1408471440
  rdb_last_bgsave_status:ok
  rdb_last_bgsave_time_sec:-1
  rdb_current_bgsave_time_sec:-1
  aof_enabled:0
  aof_rewrite_in_progress:0
  aof_rewrite_scheduled:0
  aof_last_rewrite_time_sec:-1
  aof_current_rewrite_time_sec:-1
  aof_last_bgrewrite_status:ok
  aof_last_write_status:ok
  
  Stats
  total_connections_received:25266
  total_commands_processed:123389
  instantaneous_ops_per_sec:10
  bytes_received_per_sec:275
  bytes_sent_per_sec:65
  bytes_received_per_sec_human:
  </code></pre>
  
  <p><strong>Edit 2</strong>: Here are the extension methods I'm using for Get/Set -- they are very simple methods that just turn an object into JSON and call <code>StringSet</code>.</p>
  
  <pre><code>    public static object Get(this IDatabase cache, string key)
      {
          return DeserializeJson&lt;object&gt;(cache.StringGet(key));
      }
  
      public static void Set(this IDatabase cache, string key, object value, TimeSpan? expiry = null)
      {
          cache.StringSet(key, SerializeJson(value), expiry: expiry);
      }
  </code></pre>
  
  <p><strong>Edit 3</strong>: here are a couple example error messages:</p>
  
  <pre><code>    A first chance exception of type 'System.TimeoutException' occurred in StackExchange.Redis.dll
      Timeout performing GET MyCachedList, inst: 11, queue: 1, qu=1, qs=0, qc=0, wr=0/1, in=0/0
  
      A first chance exception of type 'System.TimeoutException' occurred in StackExchange.Redis.dll
      Timeout performing GET MyCachedList, inst: 1, queue: 97, qu=0, qs=97, qc=0, wr=0/0, in=3568/0
  </code></pre>