ASP.NET Core 中的 Redis 缓存

Posted

技术标签:

【中文标题】ASP.NET Core 中的 Redis 缓存【英文标题】:Redis Cache in ASP.NET Core 【发布时间】:2017-03-15 01:04:11 【问题描述】:

我是 Redis 新手,使用 VS 2015 和 ASP.NET Core 应用程序 (v 1.0),我安装了 nugget 包:

Install-Package StackExchange.Redis

但是我无法将其注入和配置到我的服务中,没有 RedisCache 或“AddDistributedRedisCache”方法。

如何注入和使用?

【问题讨论】:

您是否真的想使用Microsoft.Extensions.Caching.Redis,这是对分布式缓存的开箱即用的redis支持?它是 IDistrubutedCache 接口 github.com/aspnet/Caching/tree/1.0.0/src 的 3 个默认实现之一 我一开始就安装了 Microsoft.Extensions.Caching.Redis,但它与 .NET Core 不兼容,我猜它需要 Framework 4.5+。 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 是的,没错。之前没注意。下一个版本将支持它。目前有一个包,但适用于 ASP.NET Core 1.1-preview1。我认为这是因为当 Microsoft 使用 ASP.NET Core 进行 RTM 时,Stackexchange.Redis 没有 .NET Core 的 RTM 版本 我猜,如果您从github.com/aspnet/Caching/tree/1.0.0/src/… 获取源并使用.NET Core 兼容版本的 StackExchange.Redis 包将其重新定位到 .NET Core,您应该可以使用它。 Caching.Redis 包不包含太多代码,只是大致包装了 SE.Redis 客户端。然后您可以立即使用它,而不是升级到尚未准备好生产的 ASP.NET Core 1.1-preview 【参考方案1】:
Install-Package StackExchange.Redis

Redis 服务:

public class RedisService : IDisposable

    private readonly IConnectionMultiplexer Connection;
    private readonly string _connectionString;


    public RedisService(IConfiguration Configuration, ILogger<RedisService> logger)
    
        _connectionString = Configuration.GetConnectionString("redis connection string");

        var conn = new Lazy<IConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(_connectionString));
        Connection = conn.Value;

        Main = Connection.GetDatabase(1); 


        logger.LogWarning("Redis Service Attached!");

    

    public IDatabase Main  get; 

   
    
    public void Dispose()
    
        Connection?.Dispose();
    

在startup.cs中添加服务

services.AddSingleton<RedisService>();

现在在你的控制器中使用它

【讨论】:

【参考方案2】:

我使用了以下解决方案并得到了答案。

1.下载 Redis-x64-3.0.504.msi 并安装(link)

2.从 Nuget 包管理器安装 Microsoft.Extensions.Caching.StackExchangeRedis

3.在Startup.cs类里面,在ConfigureServices方法中,添加这个命令:

 services.AddStackExchangeRedisCache(options => options.Configuration = "localhost:6379");

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

祝你好运!!!

【讨论】:

为什么我们要对序列化的 json 进行编码?我们可以将其保留为序列化的 json 本身吗?【参考方案3】:

01.从download下载最新的redis,从services.msc安装并启动redis服务

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

    并在 Configure 方法中添加 app.UseMvc 行的顶部

    app.UseSession();

在asp.net core的会话存储中使用redis。现在你可以在HomeController.cs

中这样使用
public class HomeController : Controller

    private readonly IDistributedCache _distributedCache;
    public HomeController(IDistributedCache distributedCache)
    
        _distributedCache = distributedCache;
    
    //Use version Redis 3.22
    //http://***.com/questions/35614066/redissessionstateprovider-err-unknown-command-eval
    public IActionResult Index()
    
        _distributedCache.SetString("helloFromRedis", "world");
        var valueFromRedis = _distributedCache.GetString("helloFromRedis");
        return View();
    
 

【讨论】:

它缺乏 StackExchange.Redis.Extension 旧非 .net 核心版本中存在的丰富功能。

以上是关于ASP.NET Core 中的 Redis 缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.Net Core 使用 分布式缓存

ASP.NET Core 2 - 多个 Azure Redis 缓存服务 DI

asp.net core 使用 Redis 和 Protobuf

ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用

ASP .NET Core MemoryCache缓存

《ASP.NET Core 6框架揭秘》实例演示[16]:内存缓存与分布式缓存的使用