性能分析接口是由这些组成的:IProfiler,ConnectionMultiplexer.RegisterProfiler(IProfiler),ConnectionMultiplexer.BeginProfiling(object), ConnectionMultiplexer.FinishProfiling(object) 还有 IProfiledCommand

    你可以用 ConnectionMultiplexer 的实例来注册一个 IProfiler 接口,注册后它不能被更改。通过调用 BeginProfiling(object) 方法开始分析一个给定的上下文(例如:Thread,HttpRequest等等),然后调用 FinishProfiling(object) 方法完成分析;FinishProfiling(object) 方法返回一个 IProfiledCommand 的集合,该集合包含计时信息的所有命令都被发送到Redis;使用给定的上下文参数,通过已配置的 ConnectionMultiplexer 对像来调用 (Begin|Finish)Profiling (也就是BeginProfiling & FinishProfiling) 方法。

    在具体的应用中什么样的 “上下文” 对象应该使用。

    • 涉及的Redis服务器
    • 运行的Redis命令
    • 路由命令的使用标志
    • 命令的初始化创建时间
    • 用了多长时间来排队命令
    • 在命令被发送后,用了多长时间接受来自Redis的响应
    • 在接受响应后,用了多长时间来处理响应
    • 如果命令被发送以回应一个集群 ASK 或 MOVED 的响应
      • 如果这样,那么原始的命令的 TimeSpan 是高精确度的, 如果运行时支持。DateTimeDateTime.UtcNow 精确度是一样的。

    由于StackExchange.Redis的异步接口,分析需要外部协助来组织相关的命令。开始分析和结束分析都是通过给定的上下文对象来实现的(通过 BeginProfiling(object) & FinishProfiling(object) 方法实现),通过 IProfiler 接口的 GetContext 方法取得上下文对象。

    下面是一个从很多不同的线程发出相关命令的示例:

    在结束后,timings 包含了16,000个 IProfiledCommand 对象:每一个命令都会被发送到Redis。

    perThreadTimings 最终会包含16项1,000个 IProfilingCommand 记录,以线程作为键来获取perThreadTimings集合中的值来发送它们。

    让我们忘记玩具示例,这里展示的是一个在MVC5应用中配置StackExchange.Redis的示例:

    首先注册 IProfiler 接口,而不是 ConnectionMultiplexer

    这些实现会组织所有的Redis命令,包括 async/await 并随着http请求初始化它们。