English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Redis 事务

Les transactions Redis peuvent exécuter plusieurs commandes à la fois et offrent les trois garanties importantes suivantes :

  • Les opérations en lots sont mises en file d'attente dans le cache avant l'envoi de la commande EXEC.

  • Après avoir reçu la commande EXEC, il entre dans l'exécution de la transaction. Si une commande de la transaction échoue, les autres commandes sont toujours exécutées.

  • Durant l'exécution de la transaction, les demandes de commandes soumises par d'autres clients ne sont pas insérées dans la séquence des commandes d'exécution de la transaction.

Une transaction traverse les trois étapes suivantes de la création à l'exécution :

  • Commencer la transaction.

  • Ajouter des commandes à la file.

  • Exécuter la transaction.

Exemple en ligne

Voici un exemple de transaction, qui commence par MULTI Commencer une transaction, puis ajouter plusieurs commandes à la file de la transaction, et enfin la EXEC Les commandes déclenchent une transaction, exécutent ensemble toutes les commandes de la transaction :

redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C"++ dans 21 jours"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C"++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C"++ dans 21 jours"
3) (entier) 3
4) 1) "Mastering Series"
   2) "C"++"
   3) "Programming"

L'exécution d'une commande Redis individuelle est atomique, mais Redis n'a ajouté aucune mécanique pour maintenir l'atomicité des transactions, donc l'exécution des transactions Redis n'est pas atomique.

Les opérations peuvent être comprises comme des scripts d'exécution en lots, mais les instructions en lots ne sont pas des opérations atomiques. L'échec d'une instruction intermédiaire ne entraînera pas le rollback des instructions déjà exécutées et ne causera pas non plus que les instructions suivantes ne soient pas exécutées.

这是官网上的说明  From redis docs on transactions:

It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

比如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。

Redis 事务命令

下表列出了 redis 事务的相关命令:

序号命令及描述
1DISCARD
取消事务,放弃执行事务块内的所有命令。
2EXEC
执行所有事务块内的命令。
3MULTI
标记一个事务块的开始。
4UNWATCH
取消 WATCH 命令对所有 key 的监视。
5WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。