2012-12-24 5 views
3

Je cherche un moyen le plus simple d'imiter un serveur Redis lent (du point de vue du client que je débogue maintenant).Imiter le serveur Redis lent

Idéalement, il s'agirait d'une commande DEBUG SLEEP <seconds>, mais je ne pense pas que ce soit le cas.

Je pourrais utiliser, disons, BLPOP pour une lecture bloquante - mais cela nécessite un thread séparé pour le débloquer ... Y at-il un moyen plus simple?

Répondre

5

En fait, il existe une commande debug sleep qui fait exactement ce que vous voulez. Il est défini dans le fichier debug.c comme:

} 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 { 

S'il vous plaît noter qu'il bloque toute la boucle d'événements Redis (toutes les connexions) contrairement à BLPOP qui ne bloquer une connexion.

> ./redis-cli debug sleep 2 
... 2 seconds wait ... 
OK 

Avec BLPOP, vous n'avez pas besoin d'un second fil puisque vous pouvez spécifier un délai d'attente:

> ./redis-cli blpop dummy_key_which_does_not_exist 2 
... 2 seconds wait ... 
(nil) 

Une autre façon de faire Redis ne répond pas est d'envoyer des signaux STOP et CONT. Une fois que vous avez le pid de l'instance, il suffit de lancer:

kill -STOP $pid 
sleep 1 
kill -CONT $pid 

Avec cette astuce signal tous les fils de l'instance Redis seront gelés (à savoir non seulement la boucle d'événements). Cela inclut les threads d'arrière-plan d'E/S.

+0

Aha! BLPOP sur clé inexistante avec timeout est exactement ce dont j'ai besoin! Merci! –

Questions connexes