복붙노트

[REDIS] ASP.NET 코어 App에서 레디 스 연결에 오류가 푸른에 호스팅

REDIS

ASP.NET 코어 App에서 레디 스 연결에 오류가 푸른에 호스팅

우리는 레디 스 캐싱 문제에 직면하고 있으며 우리의 사이트에 충돌을 일으키는.

우리가 그것을 구현하는 방법을 다음과 같습니다

우리는 다음과 같은 연결 문자열을 사용 :

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

우리는 서비스 클래스를 만들었습니다 :

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

그런 다음 Startup.cs에서 나는 다음을 사용 :

services.AddSingleton<RedisService>();

그런 다음 컨트롤러에서 우리는 의존성 주입을 사용하고 우리는 멀티플렉서에 할당 :

connectionMultiplexer = redisService.Connection;

이것은 우리가 캐시에서 얻을 방법입니다 :

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

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

이것은 우리가 삭제하는 방법입니다 :

  private async Task DeleteFromCache(string subdomain)
    {

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

이것은 우리가 추가하는 방법입니다 :

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

        }

그러나, 우리는 다음과 같은 오류가 발생합니다 : 어떤 연결 서비스이 작업에 사용할 수 없습니다

우리는 많은 사용자를 가지고 있지만, 우리는 푸른 포털에서 몇 연결을 참조하십시오

우리는 레디 스 웹 응용 프로그램의 같은 지역에 캐시 호스팅하십시오 참고.

귀하의 지원에 감사드립니다.

해결법

  1. ==============================

    1.당신의 의존성 주입 호출이 RedisService 클래스를 인스턴스화 할 때마다, 따라서 lazyConnection에 새로운 게으른 를 할당 닫기를 호출 () 또는하지 않는 한 연결 누출뿐만 아니라 새로운 연결의 결과로 최대 코드 종료 폐기 ()에 이전 lazyConnection.

    당신의 의존성 주입 호출이 RedisService 클래스를 인스턴스화 할 때마다, 따라서 lazyConnection에 새로운 게으른 를 할당 닫기를 호출 () 또는하지 않는 한 연결 누출뿐만 아니라 새로운 연결의 결과로 최대 코드 종료 폐기 ()에 이전 lazyConnection.

    다음과 같이 코드를 변경해보십시오 :

    Startup.cs에서 :

    public void ConfigureServices(IServiceCollection services)
            {
                // Add framework services.
                .........<whatever you have here>
                services.AddSingleton<RedisService>();
                services.Configure<ApplicationSettings>(options => Configuration.GetSection("ApplicationSettings").Bind(options));
            }
    

    RedisService.cs

    public class RedisService
    {
        private readonly ApplicationSettings _settings;
        private static Lazy<ConnectionMultiplexer> lazyConnection;
        static object connectLock = new object();
    
        public RedisService(IOptions<ApplicationSettings> settings)
        {
            _settings = settings.Value;
            if (lazyConnection == null)
            {
                lock (connectLock)
                {
                    if (lazyConnection == null)
                    {
                        lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
                        {
                            return ConnectionMultiplexer.Connect(_settings.RedisConnection);
                        });
                    }
                }
            }
        }
    
        public static ConnectionMultiplexer Connection
        {
            get
            {
                return lazyConnection.Value;
            }
        }
    }
    

    ApplicationSettings.cs

    public class ApplicationSettings
        {
            public string RedisConnection { get; set; }
        }
    

    appsettings.json

    {
        "Logging": {
            "IncludeScopes": false,
            "LogLevel": {
                "Default": "Debug",
                "System": "Information",
                "Microsoft": "Information"
            }
        },
        "ApplicationSettings": {
            "RedisConnection": "yourcachename.redis.cache.windows.net:6380,password=yourpassword,ssl=True,abortConnect=False,syncTimeout=4000"
        }
    }
    

    HomeController.cs

    public class HomeController : Controller
        {
            private RedisService redisService;
            private ConnectionMultiplexer connectionMultiplexer;
            public HomeController(IOptions<ApplicationSettings> settings)
            {
                redisService = new RedisService(settings);
                connectionMultiplexer = RedisService.Connection;
            }
            public IActionResult Index()
            {
                AddToCache("foo1", "bar").GetAwaiter().GetResult();
    
                return View();
            }
    
            private async Task<string> GetFromCache(string key)
            {
                if (connectionMultiplexer.IsConnected)
                {
                    var cache = connectionMultiplexer.GetDatabase();
    
                    return await cache.StringGetAsync(key);
                }
                else
                {
                    return null;
                }
            }
    
            private async Task DeleteFromCache(string subdomain)
            {
                if (connectionMultiplexer.IsConnected)
                {
                    var cache = connectionMultiplexer.GetDatabase();
                    await cache.KeyDeleteAsync(subdomain).ConfigureAwait(false);
                }
            }
    
            private async Task AddToCache(string key, string serializedData)
            {
                var GetMessagesCacheExpiryMinutes = 5;
                var GetProfileCacheExpiryHours = 1;
                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);
    
                }
            }
    
  2. ==============================

    2.https://gist.github.com/JonCole/317fe03805d5802e31cfa37e646e419d, azureRedis를 사용하는 사람들을위한 흥미로운 일이 될 수있다 -이 문서는 생각한다. connectionMultiplexer가 레디 스에 다시 연결할 수없는 경우에 당신이 재시도 논리를 구현해야하므로 StackExchange.Redis를 사용하는 경우, 당신은, 상황에 직면 할 수있다. 기사에서 자세한 내용.

    https://gist.github.com/JonCole/317fe03805d5802e31cfa37e646e419d, azureRedis를 사용하는 사람들을위한 흥미로운 일이 될 수있다 -이 문서는 생각한다. connectionMultiplexer가 레디 스에 다시 연결할 수없는 경우에 당신이 재시도 논리를 구현해야하므로 StackExchange.Redis를 사용하는 경우, 당신은, 상황에 직면 할 수있다. 기사에서 자세한 내용.

  3. from https://stackoverflow.com/questions/44297125/error-in-redis-connection-in-asp-net-core-app-hosted-on-azure by cc-by-sa and MIT license