前几天挖了个坑,今天就来填这个坑了。关于在ASP.NET Core 2.0下使用Redis的问题,目前StackExchange.Redis已经支持.Net Core 2.0了,而微软提供的Microsoft.Extensions.Caching.Redis.Core方法,也是对StackExchange.Redis的一种官方封装,是基于StackExchange.Redis的,但是大家反映StackExchange.Redis在.Net Core下高并发容易出现死锁问题,目前没有解决办法。
本例是基于CSRedis来实现的,CSRedis 是国外大神写的,经过少量修改,现已支持 .NETCore
使用方法,先新建一个Redis缓存的类库,我这里命名为:Biz126.RedisCache,在该类库下新增一个名为RedisHelper的Redis帮助类:
namespace Biz126.RedisCache
{
public class RedisHelper : CSRedis.QuickHelperBase
{
public static IConfigurationRoot Configuration { get; internal set; }
public static void InitializeConfiguration(IConfigurationRoot cfg)
{
Configuration = cfg;
string ip, pass;
if (!int.TryParse(Convert.ToString(cfg["Redis:port"]), out int port)) port = 6379;
if (!int.TryParse(Convert.ToString(cfg["Redis:poolsize"]), out int poolsize)) poolsize = 50;
if (!int.TryParse(Convert.ToString(cfg["Redis:database"]), out int database)) database = 0;
ip = Convert.ToString(cfg["Redis:ip"]);
pass = Convert.ToString(cfg["Redis:pass"]);
Name = Convert.ToString(cfg["Redis:name"]);
Instance = new CSRedis.ConnectionPool(ip, port, poolsize);
Instance.Connected += (s, o) =>
{
CSRedis.RedisClient rc = s as CSRedis.RedisClient;
if (!string.IsNullOrEmpty(pass)) rc.Auth(pass);
if (database > 0) rc.Select(database);
};
}
}
}
需要添加对Microsoft.Extensions.Configuration的引用。
在主项目下,引用该类库,打开Startup文件,把之前的构造函数换成如下所示:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
Configuration = builder.Build();
RedisHelper.InitializeConfiguration(Configuration); //Redis
}
同时之前的Configuration属性,也需要对应的修改,换成IConfigurationRoot类型,就可以了:
public IConfigurationRoot Configuration { get; }
以上。
本文作者:老徐
本文链接:https://bigger.ee/archives/369.html
转载时须注明出处及本声明
One comment
我正在解决csredis 高并发存取的问题,请问有什么方法可以减少连接池的创建和关闭呢?