[REDIS] ASP.NET 코어 App에서 레디 스 연결에 오류가 푸른에 호스팅
REDISASP.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.당신의 의존성 주입 호출이 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.https://gist.github.com/JonCole/317fe03805d5802e31cfa37e646e419d, azureRedis를 사용하는 사람들을위한 흥미로운 일이 될 수있다 -이 문서는 생각한다. connectionMultiplexer가 레디 스에 다시 연결할 수없는 경우에 당신이 재시도 논리를 구현해야하므로 StackExchange.Redis를 사용하는 경우, 당신은, 상황에 직면 할 수있다. 기사에서 자세한 내용.
https://gist.github.com/JonCole/317fe03805d5802e31cfa37e646e419d, azureRedis를 사용하는 사람들을위한 흥미로운 일이 될 수있다 -이 문서는 생각한다. connectionMultiplexer가 레디 스에 다시 연결할 수없는 경우에 당신이 재시도 논리를 구현해야하므로 StackExchange.Redis를 사용하는 경우, 당신은, 상황에 직면 할 수있다. 기사에서 자세한 내용.
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
'REDIS' 카테고리의 다른 글
[REDIS] 거래 및 유지 Node.js를가 / 세션을 표현 (0) | 2020.01.26 |
---|---|
[REDIS] 당신은 어떻게 TCP 연결에서 오는 모든 바이트를 읽습니까? (0) | 2020.01.26 |
[REDIS] 채널 층 또는 다른 무료 호스팅없이 채널 (0) | 2020.01.25 |
[REDIS] 어떻게 node_redis를 사용하는 경우 hgetall에 전달 된 키에 액세스 할 수 있습니까? (0) | 2020.01.25 |
[REDIS] 레디 스 센티넬과 올바른 @EnableRedisHttpSession 구성 (0) | 2020.01.25 |