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 2 - 多个 Azure Redis 缓存服务 DI
asp.net core 使用 Redis 和 Protobuf