Как заставить работать кеш redis в основной сети asp.net, развернутой на IIS Express, но работающей на localhost - PullRequest
0 голосов
/ 24 мая 2019

Я использую "Redis-x64-3.0.504" и пытаюсь разместить свое веб-приложение asp.net core 2.2 на IIS Express локально, но кэш redis не работает должным образом на IIS, потому что, кажется, застрялпри загрузке при доступе или сохранении в кеш.Тем не менее - он работает отлично, когда я запускаю Visual Studio как localhost.

Я добавил Microsoft.Extentions.Caching.StackExchangeRedis (2.2.5) nuget и код в ConfigureServices(IServiceCollection service) для конфигурации.

Код выглядит следующим образом:

services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost";
    options.InstanceName = "SampleInstance";
});

А затем я создал класс CacheHelper в качестве обобщенного метода для доступа к кэшу:

public static class CacheHelper
{
    public static void SaveInCache<T>(IDistributedCache memoryCache, string key, T value)
    {
        var graphJSON = JsonConvert.SerializeObject(value);
        memoryCache.SetStringAsync(key, graphJSON);
    }

    public static T GetFromCache<T>(IDistributedCache memoryCache, string key)
    {
        var cacheValue = memoryCache.GetStringAsync(key);
        return JsonConvert.DeserializeObject<T>(cacheValue.Result != null ? cacheValue.Result : string.Empty);
    }

    public static T GetMatchFromCache<T>(IDistributedCache memoryCache, string matchKey)
    {
        var redis = StackExchange.Redis.ConnectionMultiplexer.Connect("localhost");
        var db = redis.GetDatabase();
        var serverEndpoints = redis.GetEndPoints()[0];
        var keys = redis.GetServer(serverEndpoints).Keys(pattern: "*");

        foreach(var key in keys)
        {
            if (key.ToString().Contains(matchKey))
            {
                var trimmedKey = key.ToString().Substring(key.ToString().IndexOf(matchKey));
                return GetFromCache<T>(memoryCache, trimmedKey);
            }
        }

        return default(T);
    }

    public static List<T> GetAllMatchFromCache<T>(IDistributedCache memoryCache, string matchKey)
    {
        List<T> contentList = new List<T>();
        var redis = StackExchange.Redis.ConnectionMultiplexer.Connect("localhost");
        var db = redis.GetDatabase();
        var serverEndpoints = redis.GetEndPoints()[0];
        var keys = redis.GetServer(serverEndpoints).Keys(pattern: "*");

        foreach (var key in keys)
        {
            if (key.ToString().Contains(matchKey))
            {
                var trimmedKey = key.ToString().Substring(key.ToString().IndexOf(matchKey));
                var cacheReturn = GetFromCache<T>(memoryCache, trimmedKey);
                if (cacheReturn != null)
                {
                    contentList.Add(cacheReturn);
                }
            }
        }

        return contentList;
    }
}

Я так растерялся, почему это не работает на IIS, ноработает на моем местном хосте.Как я могу заставить это работать на хосте IIS?

1 Ответ

0 голосов
/ 24 мая 2019

Попробуйте выполнить подключение как показано ниже:

using (var muxer = ConnectionMultiplexer.Connect("localhost,resolvedns=1"))
        {
            muxer.PreserveAsyncOrder = preserveOrder;
            RedisKey key = "MBOA";
            var conn = muxer.GetDatabase();
            muxer.Wait(conn.PingAsync());

            Action<Task> nonTrivial = delegate
            {
                Thread.SpinWait(5);
            };
            var watch = Stopwatch.StartNew();
            for (int i = 0; i <= AsyncOpsQty; i++)
            {
                var t = conn.StringSetAsync(key, i);
                if (withContinuation) t.ContinueWith(nonTrivial);
            }
            int val = (int)muxer.Wait(conn.StringGetAsync(key));
            watch.Stop();

            Console.WriteLine("After {0}: {1}", AsyncOpsQty, val);
            Console.WriteLine("({3}, {4})\r\n{2}: Time for {0} ops: {1}ms; ops/s: {5}", AsyncOpsQty, watch.ElapsedMilliseconds, Me(),
                withContinuation ? "with continuation" : "no continuation", preserveOrder ? "preserve order" : "any order",
                AsyncOpsQty / watch.Elapsed.TotalSeconds);
        }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...