>

우리는 Redis 캐싱에 문제가 있으며 사이트에서 충돌을 일으 킵니다.

다음은 우리가 그것을 구현 한 방법입니다 :

다음 연결 문자열을 사용했습니다 :

"*******.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);
        }

그러나 다음과 같은 오류가 발생합니다. 이 작업을 서비스 할 수있는 연결이 없습니다

사용자는 많지만 Azure Portal에는 연결이 거의 없습니다 :

웹앱의 같은 지역에서 Redis 캐시를 호스팅했습니다.

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


  • 답변 # 1

    종속성 주입 호출이 RedisService 클래스를 인스턴스화 할 때마다 코드에 새로운 Lazy<ConnectionMultiplexer> 가 할당됩니다.  이전 lazyConnection에서 Close () 또는 Dispose ()를 호출하지 않으므로 새 연결 및 연결 누수가 발생합니다.

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

    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를 사용하는 사람들에게 흥미로울 수 있다고 생각합니다. StackExchange.Redis를 사용하는 경우 connectionMultiplexer가 redis에 다시 연결할 수없는 상황에 직면 할 수 있으므로 재시도 논리를 구현해야합니다. 기사에서 자세한 내용을 확인하십시오.

  • 이전 javascript - 각도를 사용하여 로그인 페이지에서 머리글과 바닥 글을 숨길 수 없음
  • 다음 reporting services - SSRS가 애플리케이션 도메인을 재활용해야하는 이유