第12章 初识SqlSugarCore之监视Redis性能

1 准备工作

    通过Nuget引用中间件包:

  1. MiniProfiler.AspNetCore.Mvc
  2. Microsoft.Extensions.Caching.StackExchangeRedis

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<IActionResult> MiniProfilerList()

        {

            List<Exam> _examList = new List<Exam>();

            ISugarQueryable<Exam> _scoreQueryable = null;

            using (MiniProfiler.Current.Step($"构建查询:{DateTime.Now.ToString("mm:ss:ffffff")}"))

            {

                // Queryable:具有lazy load的特性,执行后不会立即对数据库执行查询操作, 而是在“ToList/ToListAsync”方法被执行时,

                // 才立即执行查询操作,“Queryable”在提高程序效率的同时(在有查询条件的情况下)减少内存开销。

                _scoreQueryable = _context.SugarScope.Queryable<Exam>()

                .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<IActionResult> RedisMiniProfiler()

        {

            List<Exam> _examList = new List<Exam>();

            ISugarQueryable<Exam> _scoreQueryable = null;

         

            using (MiniProfiler.Current.Step($"构建查询:{DateTime.Now.ToString("mm:ss:ffffff")}"))

            {

                // Queryable:具有lazy load的特性,执行后不会立即对数据库执行查询操作, 而是在“ToList/ToListAsync”方法被执行时,

                // 才立执行即查询操作,“Queryable”在提高程序效率的同时(在有查询条件的情况下)减少内存开销。

                _scoreQueryable = _context.SugarScope.Queryable<Exam>()

                .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<Exam>)。

                _examList = JsonConvert.DeserializeObject<List<Exam>>(_json);

            }

            return View(_examList);

        }

4 性能监视图示

对以上功能更为具体实现和注释见:22-10-22-12_SqlSugarAcquaintance(初识SqlSugarCore之监视Redis性能)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值