1 准备工作
通过Nuget引用中间件包:
2 实现对常规数据调用的性能进行监视
2.1 重构Program.cs
//把“MiniProfiler.AspNetCore.Mvc”中间件,依赖注入到.Net(Core)6框架内置容器中。
builder.Services.AddMiniProfiler();
//把内置“认证”管道中件间集成到.Net(Core)6框架中。
app.UseAuthentication();
app.UseAuthorization();
//把第3方“监视器”管道中件间集成到.Net(Core)6框架中。
//注意:第3方“监视器”管道中件间,必须在“认证”管道中件间之后被集成。
app.UseMiniProfiler();
2.2 重构HomeController
public async Task
{
List
ISugarQueryable
using (MiniProfiler.Current.Step($"构建查询:{DateTime.Now.ToString("mm:ss:ffffff")}"))
{
// Queryable:具有lazy load的特性,执行后不会立即对数据库执行查询操作, 而是在“ToList/ToListAsync”方法被执行时,
// 才立即执行查询操作,“Queryable”在提高程序效率的同时(在有查询条件的情况下)减少内存开销。
_scoreQueryable = _context.SugarScope.Queryable
.Includes(score => score.CourseSingleton)//1层级联
.Includes(
score => score.StudentSingleton,
student => student.SpecialtySingleton)//2层级联
.Includes(
score => score.StudentSingleton,
student => student.CategorySingleton)//2层级联
.Includes(
score => score.StudentSingleton,
student => student.CategorySingleton,
category => category.GradeSingleton);//3层级联
}
using (MiniProfiler.Current.Step($"获取查询数据:{DateTime.Now.ToString("mm:ss:ffffff")}"))
{
//通过级联操作,获取与考试相关的所有数据,为页面的渲染显示提供支撑。
_examList = await _scoreQueryable.ToListAsync();
}
return View(_examList);
3 实现对Redis数据调用的性能进行监视
3.1 重构appsettings.json
//redis为必须启动项,请保持redis为正常可用
"RedisConfig": {
"Enabled": false, //启用redis作为内存选择
"UseRedisMessageQueue": false, //启用redis作为队列选择
//"Name:是别名,可以任意起。
//Ip:是Redis的服务端地址,例如安装本地,就是:127.0.0.1"。
//Port:端口号默认值:6379。
//Password:可以在配置字符串字符串中设置;也可以通过Redis安装的根目录下的配置文件(redis.windows.conf)进行设置,那么该密码就是全局性的。
//Timeout:连接的超时时间,当设置Timeout或把Timeout设置为:0时表示不断开。设置timeout时间是为了让Redis主动清理长时间空闲的客户端连接,以回收内存资源。也就是说,可以设置timeout参数来限制客户端连接的空闲时间。
//connectRetry:连接的超时时后的,自动重新连接次数:3次,注意:该配置只在连接操作时有效。
//syncTimeout:超时会影响redis取值的超时,但是开多个task时,超时设置非常大也解决不了。
//DefaultDatabase:Redis软件的分布式数据库的编号值,一般Redis软件的分布式数据库的编号值默认是:0到15,当前配置为:10。注意:此处的配置使用的是数组,用于将来进行Redis分布式操作的可拓展。
"ConnectionString": "127.0.0.1:6379,Timeout=3000,connectRetry=3,syncTimeout=10000,DefaultDatabase=10"
},
3.2重构Program.cs
//把“Microsoft.Extensions.Caching.StackExchangeRedis”中间件实例,依赖注入到.Net(Core)6框架内置容器中。
builder.Services.AddSingleton(iServiceProvider =>
{
//从“appsettings.json”文件中,获取Redis分布式数据库软件的连接字符串。
string _redisConnectionString = builder.Configuration["RedisConfig:ConnectionString"];
//通过“ConfigurationOptions.Parse”方法,直接获取“Microsoft.Extensions.Caching.StackExchangeRedis”中间件实例化所需的参实例。
var _configuration = ConfigurationOptions.Parse(_redisConnectionString, true);
//通过“ConfigurationOptions.Parse”方法,获取“Microsoft.Extensions.Caching.StackExchangeRedis”中间件实例化所需的“IP地址”相对应的参实例。
_configuration.ResolveDns = true;
//通过“ConfigurationOptions”实例中的参数实例,完成“Microsoft.Extensions.Caching.StackExchangeRedis”中间件的实例化后,
//把“Microsoft.Extensions.Caching.StackExchangeRedis”中间件实例,依赖注入到.Net(Core)6框架内置容器中。
return ConnectionMultiplexer.Connect(_configuration);
});
3.1 重构HomeController
public async Task
{
List
ISugarQueryable
using (MiniProfiler.Current.Step($"构建查询:{DateTime.Now.ToString("mm:ss:ffffff")}"))
{
// Queryable:具有lazy load的特性,执行后不会立即对数据库执行查询操作, 而是在“ToList/ToListAsync”方法被执行时,
// 才立执行即查询操作,“Queryable”在提高程序效率的同时(在有查询条件的情况下)减少内存开销。
_scoreQueryable = _context.SugarScope.Queryable
.Includes(score => score.CourseSingleton)//1层级联
.Includes(
score => score.StudentSingleton,
student => student.SpecialtySingleton)//2层级联
.Includes(
score => score.StudentSingleton,
student => student.CategorySingleton)//2层级联
.Includes(
score => score.StudentSingleton,
student => student.CategorySingleton,
category => category.GradeSingleton);//3层级联
}
using (MiniProfiler.Current.Step($"获取查询数据:{DateTime.Now.ToString("mm:ss:ffffff")}"))
{
var database = _connectionMultiplexer.GetDatabase();
RedisValue _json = new RedisValue();
//如果Redis分布式数据库软件中没有“ExamAll”键。
if (!await database.KeyExistsAsync("ExamAll"))
{
// 则在Redis分布式数据库软件中添加该键,同时把所有考试成绩实例,以JSON编码格式保存到Redis分布式数据库软件中,最终把二者构建为相对应的键/值对。
await database.StringSetAsync("ExamAll", JsonConvert.SerializeObject(await _scoreQueryable.ToListAsync()), TimeSpan.FromSeconds(300));
//通过“ExamAll”键,获取Redis分布式数据库软件中与之相对的数据。
_json = await database.StringGetAsync("ExamAll");
}
//如果Redis分布式数据库软件中有“ExamAll”键。
else
{
// 则通过“ExamAll”键,获取Redis分布式数据库软件中与之相对的数据。
_json = await database.StringGetAsync("ExamAll");
}
//把从Redis分布式数据库软件中获取的数据,通过JSON编码格式反序列化为指定的实例(这里特指:List
_examList = JsonConvert.DeserializeObject>(_json);
}
return View(_examList);
}
4 性能监视图示
对以上功能更为具体实现和注释见:22-10-22-12_SqlSugarAcquaintance(初识SqlSugarCore之监视Redis性能)。