2011-05-01 2 views
3

Comment utilisez-vous MULTI/EXEC (et WATCH) dans un pilote Redis Evented comme le em-hiredis (un pilote Ruby qui utilise EventMachine)? Si je lance:Redis multi/exec avec un pilote evented

redis.multi do 
    redis.sadd("foo", "bar") do 
    redis.inc("baz", "qux") do 
     redis.exec do 
     puts 'yay!' 
     end 
    end 
    end 
end 

il y a une chance qu'une autre partie de la demande parvient à se faufiler dans une opération avant la EXEC, s'il y a beaucoup de choses (imaginez, par exemple, que j'ai une minuterie incrémente une clé toutes les secondes, et que le code ci-dessus prend plus d'une seconde à exécuter, puis certaines des commandes d'incrément seront envoyées dans le cadre du MULTI/EXEC - que se passe-t-il si je veux abandonner la transaction? est arrivé à faire partie de celui-ci va disparaître.Il est facile de venir avec des scénarios encore pire).

Je suppose que je pourrais mettre en œuvre une sorte de verrouillage afin qu'aucune autre action peut se faire en un MULTI/EXEC est en cours, mais qui ne se sent pas comme une excellente solution, a trouvé quelqu'un d'autre une meilleure façon? Comme @balu indiqué dans les commentaires à la question, il ne peut pas être fait sans connexions multiples

+0

Avez-vous regardé https://github.com/igrigorik/em-synchrony il a un gestionnaire pour em-hiredis – hellvinz

+0

Oui, je connais 'em-synchronie', mais ça ne change rien. Les choses se passeront toujours dans le même ordre, il sera juste plus facile de voir le flux de contrôle (mais dans ce cas, je dirais que cela rendrait également la condition de la course moins évidente). – Theo

+0

Pour que ce genre de chose fonctionne, vous devez ouvrir une connexion séparée ou utiliser un pool de connexions. – balu

Répondre

0

+0

Si quelqu'un écrit une réponse correcte à cette question, je serai heureux d'en faire la réponse acceptée et de supprimer celle-ci. – Theo

+0

Salut, pouvez-vous répondre [this] (http://stackoverflow.com/questions/28457538/sql-trigger-after-insert-update-another-table-with-conditions), merci – stom