Кэш Redis в ASP.NET Core

Я новичок в Redis и использую приложение VS 2015 и ASP.NET Core (v 1.0), я установил пакет nugget:

Install-Package StackExchange.Redis

Однако я не могу внедрить и настроить его в своих службах, нет метода RedisCache или "AddDistributedRedisCache".

Как я могу ввести и использовать его?


person Hussein Salman    schedule 01.11.2016    source источник
comment
Вы действительно хотели вместо этого использовать Microsoft.Extensions.Caching.Redis, который является встроенной поддержкой redis для распределенного кэширования? Это одна из трех стандартных реализаций интерфейса IDistrubutedCache github.com/aspnet/Caching/. дерево/1.0.0/источник   -  person Tseng    schedule 01.11.2016
comment
Я установил Microsoft.Extensions.Caching.Redis в первый момент, но он не совместим с .NET Core, я думаю, ему нужен Framework 4.5+.   -  person Hussein Salman    schedule 01.11.2016
comment
StackExchange.Redis содержит только клиент Redis, он не реализуется в ASP.NET Core. Но интерфейс Microsofts distributed caching implementation uses Microsoft.Extensions.Caching.Redis, its just a wrapper around it and the IDistrubtedCache`. github.com/aspnet/Caching/blob/dev/src/Microsoft.Extensions.Caching.Redis/RedisCache.cs   -  person Tseng    schedule 01.11.2016
comment
Да все верно. Не замечал раньше. Следующая версия будет поддерживать его. В настоящее время есть пакет, но для ASP.NET Core 1.1-preview1. Я думаю, это потому, что у Stackexchange.Redis не было версии RTM для .NET Core, когда Microsoft перешла на RTM с ASP.NET Core.   -  person Tseng    schedule 01.11.2016
comment
Думаю, если взять исходный код с github .com/aspnet/Caching/tree/1.0.0/src/ и перенастройте его для .NET Core с помощью совместимой с .NET Core версии пакета StackExchange.Redis, вы должны заставить его работать. Пакет Caching.Redis не содержит большого количества кода, он лишь грубо оборачивает клиент SE.Redis. Затем вы можете использовать его прямо сейчас вместо обновления до предварительной версии ASP.NET Core 1.1, которая еще не готова к работе.   -  person Tseng    schedule 01.11.2016
comment
Я попытался решить и начал менять зависимости. Я начал с проекта Micorosoft.Extensions.Caching.Abstratctions, так как на него ссылается библиотека классов Redis. Однако у меня возникли проблемы, поскольку я не могу разрешить одну из зависимостей, проверьте это вопрос   -  person Hussein Salman    schedule 02.11.2016
comment
Используйте nuget.org/packages/Microsoft.Extensions.Caching.Redis. Core вместо одного (без Core), я думаю, для основного материала .Net... Если вы хотите иметь больше функциональности, чем просто Set/Get с байтовыми массивами, попробуйте www.cachemanager.net.   -  person MichaC    schedule 23.12.2016


Ответы (2)


01. Загрузите последнюю версию Redis из скачать, установите и запустите службу Redis из services.msc.

02. Добавьте две библиотеки в project.json.

"Microsoft.Extensions.Caching.Redis.Core": "1.0.3",
"Microsoft.AspNetCore.Session": "1.1.0",

03. Добавьте инъекцию зависимостей в

public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddMvc();
        //For Redis
        services.AddSession();
        services.AddDistributedRedisCache(options =>
        {
            options.InstanceName = "Sample";
            options.Configuration = "localhost";
        });
  } 
  1. и в методе Configure добавьте верхнюю часть строки app.UseMvc

    приложение.UseSession();

использовать Redis в хранилище сеансов в ядре asp.net. Теперь вы можете использовать это в HomeController.cs

public class HomeController : Controller
{
    private readonly IDistributedCache _distributedCache;
    public HomeController(IDistributedCache distributedCache)
    {
        _distributedCache = distributedCache;
    }
    //Use version Redis 3.22
    //http://stackoverflow.com/questions/35614066/redissessionstateprovider-err-unknown-command-eval
    public IActionResult Index()
    {
        _distributedCache.SetString("helloFromRedis", "world");
        var valueFromRedis = _distributedCache.GetString("helloFromRedis");
        return View();
    }
 }
person syed mhamudul hasan akash    schedule 04.04.2017
comment
Не хватает богатой функции, существующей в старой версии StackExchange.Redis.Extension без ядра .net. - person Kamran Shahid; 27.09.2018

Я использовал следующее решение и получил ответ.

1. Загрузите Redis-x64-3.0.504.msi и установите его (ссылка)

2. Установите Microsoft.Extensions.Caching.StackExchangeRedis из диспетчера пакетов Nuget.

3. Внутри класса Startup.cs в методе ConfigureServices добавьте следующую команду:

 services.AddStackExchangeRedisCache(options => options.Configuration = "localhost:6379");
  1. внедрить IDistributedCache в контроллер:

     private readonly IDistributedCache _distributedCache;
    
     public WeatherForecastController( IDistributedCache distributedCache)
     {
         _distributedCache = distributedCache;
     }
    

5.В конце:

   [HttpGet]
    public async Task<List<string>> GetStringItems()
    {
        string cacheKey = "redisCacheKey";
        string serializedStringItems;
        List<string> stringItemsList;

        var encodedStringItems = await _distributedCache.GetAsync(cacheKey);
        if (encodedStringItems != null)
        {
            serializedStringItems = Encoding.UTF8.GetString(encodedStringItems);
            stringItemsList = JsonConvert.DeserializeObject<List<string>>(serializedStringItems);
        }
        else
        {
            stringItemsList = new List<string>() { "John wick", "La La Land", "It" };
            serializedStringItems = JsonConvert.SerializeObject(stringItemsList);
            encodedStringItems = Encoding.UTF8.GetBytes(serializedStringItems);
            var options = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(1))
                .SetAbsoluteExpiration(TimeSpan.FromHours(6));
            await _distributedCache.SetAsync(cacheKey, encodedStringItems, options);

        }
        return stringItemsList;
    }

Удачи!!!

person Milad Safari    schedule 25.09.2020
comment
Почему мы кодируем сериализованный json? Можем ли мы сохранить его как сериализованный json? - person Sumesh Es; 06.07.2021