• 第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 MiniProfilerList()

            {

                List _examList = new List();

                ISugarQueryable _scoreQueryable = null;

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

            {

                List _examList = new List();

                ISugarQueryable _scoreQueryable = null;

             

                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性能)。

  • 相关阅读:
    0.0和0.00竟然不相等!!!BigDecimal别用错了比较方式
    HarmonyOS 实现表单页面的输入,必填校验和提交
    Log4j 漏洞最早由阿里云团队发现;HashiCorp 挂牌上市,市值 152 亿美元;Go 1.18 Beta1 发布 | 开源日报
    uniapp制作——交友盲盒
    ES6 入门教程 25 Module 的加载实现 25.4 循环加载
    任务十一 BERT
    仪表板使用:汽车充电站
    用QT实现一个简单的桌面宠物
    初学Python记
    29 | 聊聊性能测试的基本方法与应用领域
  • 原文地址:https://blog.csdn.net/zhoujian_911/article/details/127458103