Error in Redis Connection in ASP.NET Core App Hosted on Azure

Viewed 3307

We are facing problems with Redis caching and it's causing crashes in our site.

The following is how we implemented it:

We used the following connection string:

"*******.redis.cache.windows.net:6380,password=*****=,ssl=True,abortConnect=False"

We created a service class:

using Microsoft.Extensions.Options;
using SarahahDataAccessLayer;
using StackExchange.Redis;
using System;

namespace Sarahah.Services
{
    public class RedisService
    {
        private static Lazy<ConnectionMultiplexer> lazyConnection;
        private readonly ApplicationSettings _settings;
        public RedisService(IOptions<ApplicationSettings> settings)
        {
            _settings = settings.Value;
            lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
            {
                return ConnectionMultiplexer.Connect(_settings.RedisConnection);
            });
        }



        public  ConnectionMultiplexer Connection
        {
            get
            {
                return lazyConnection.Value;
            }
        }
    }
}

Then in Startup.cs I use the following:

services.AddSingleton<RedisService>();

Then in controllers we use dependency injection and we assign to a multiplexer:

connectionMultiplexer = redisService.Connection;

This is how we get from the cache:

 private async Task<string> GetFromCache(string key)
    {
        if (connectionMultiplexer.IsConnected)
        {
            var cache = connectionMultiplexer.GetDatabase();

                return await cache.StringGetAsync(key);
        }
        else
        {
            return null;
        }
    }

This is how we delete:

  private async Task DeleteFromCache(string subdomain)
    {

            if (connectionMultiplexer.IsConnected)
            {
                var cache = connectionMultiplexer.GetDatabase();
                await cache.KeyDeleteAsync(subdomain).ConfigureAwait(false);
            }
    }

This is how we add:

 {
        if (connectionMultiplexer.IsConnected)
        {
            var cache = connectionMultiplexer.GetDatabase();

                TimeSpan expiresIn;
                // Search Cache
                if (key.Contains("-"))
                {
                    expiresIn = new TimeSpan(0, GetMessagesCacheExpiryMinutes, 0);
                }
                // User info cache
                else
                {
                    expiresIn = new TimeSpan(GetProfileCacheExpiryHours, 0, 0);
                }
                await cache.StringSetAsync(key, serializedData, expiresIn).ConfigureAwait(false);

        }

However, we get the following error: No connection is available to service this operation

Although we have a lot of users, we only see few connections in Azure portal:

Very small number of connections

Please note that we hosted the redis cache in the same region of the web app.

Your support is appreciated.

1 Answers
Related