模仿慢Redis服务器

Ale*_*ysh 3 autotest redis

我正在寻找一种模仿慢速Redis服务器的最简单方法(从我现在调试的客户端的角度来看).

理想情况下,这将是一个DEBUG SLEEP <seconds>命令,但AFAIK没有这样的事情.

我可以使用,例如,BLPOP阻塞读取 - 但这需要一个单独的线程来解锁它...有一个更简单的方法吗?

Did*_*zia 6

实际上,有一个调试睡眠命令可以完全按照您的要求执行.它在debug.c文件中定义为:

} else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) {
    double dtime = strtod(c->argv[2]->ptr,NULL);
    long long utime = dtime*1000000;

    usleep(utime);
    addReply(c,shared.ok);
} else {
Run Code Online (Sandbox Code Playgroud)

请注意它阻止整个Redis事件循环(所有连接)与BLPOP相反,只会阻止一个连接.

> ./redis-cli debug sleep 2
 ... 2 seconds wait ...
OK
Run Code Online (Sandbox Code Playgroud)

使用BLPOP,您不需要第二个线程,因为您可以指定超时:

> ./redis-cli blpop dummy_key_which_does_not_exist 2
 ... 2 seconds wait ...
(nil)
Run Code Online (Sandbox Code Playgroud)

使Redis无响应的另一种方法是发送STOP和CONT信号.获得实例的pid后,只需启动:

kill -STOP $pid
sleep 1
kill -CONT $pid
Run Code Online (Sandbox Code Playgroud)

有了这个信号技巧,redis实例的所有线程都将被冻结(即不仅仅是事件循环).这包括I/O后台线程.