13

这似乎应该是微不足道的,但我想通过 redis-cli 运行查询,然后返回在服务器上花费了多长时间以及结果。这仅用于调试目的,以排除我的客户端库或延迟的问题。有没有办法做到这一点?

4

2 回答 2

18

您可以通过将您正在调查的 redis 命令包装在一个MULTI/EXEC块中来做到这一点,该TIME命令在您的命令之前之后使用。例如:

使用节点库:

var multi = redis.multi();
multi.time(); // start time
multi.sunionstore(['fast_food_joints', 'pizza_hut', 'taco_bell']); // this is the command I'm investigating
multi.time(); // end time
multi.exec(function(err, responses){
    var response = responses[1]; // the response i care about
    var start = (parseInt(responses[0][0]) * 1000) + (parseInt(responses[0][1]) / 1000);
    var end   = (parseInt(responses[2][0]) * 1000) + (parseInt(responses[2][1]) / 1000);            
    var execution_time = end - start; // in milliseconds
});

或者...使用命令行(这是您在问题中要求的):

192.168.1.1:6379> MULTI
OK
192.168.1.1:6379> TIME
QUEUED
192.168.1.1:6379> SUNIONSTORE fast_food_joints pizza_hut taco_bell
QUEUED
192.168.1.1:6379> TIME
QUEUED
192.168.1.1:6379> EXEC
1) 1) "1450818240"
   2) "666636"
2) (integer) 48886
3) 1) "1450818240"
   2) "666639"

然后自己做数学。上面的例子用了 3 微秒。

于 2015-12-22T21:20:10.487 回答
2

您可以将慢速日志设置为 0(零)。这样做会记录每个命令。

您将看到的时间以微秒为单位,从文档中这一次意味着:

执行时间不包括与客户端对话、发送回复等 I/O 操作,而只是实际执行命令所需的时间(这是命令执行的唯一阶段,线程被阻塞并且可以在此期间不服务其他请求)

为了考虑网络性能,您可能不得不破解您的客户端库,在与 redis 通信之前和之后进行记录,而忽略您的库可能进行的任何转换。

于 2013-08-13T14:59:58.297 回答