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

Redis 事务

Le transazioni Redis possono eseguire più comandi in una volta e offrono tre garanzie importanti:

  • Le operazioni batch vengono messe in coda nella cache prima di inviare il comando EXEC.

  • Dopo aver ricevuto il comando EXEC, entra nell'esecuzione della transazione, se un comando nella transazione fallisce, gli altri comandi vengono comunque eseguiti.

  • Durante l'esecuzione della transazione, le richieste di comandi inviate da altri client non vengono inserite nella sequenza di esecuzione dei comandi della transazione.

Un'operazione transazionale attraversa tre fasi: da inizio a esecuzione.

  • Inizia la transazione.

  • Metti i comandi in coda.

  • Esegui la transazione.

Esempio online

Ecco un esempio di transazione, che prima di tutto MULTI Inizia una transazione, quindi metti in coda più comandi alla transazione, infine EXEC Un comando attiva una transazione, esegue tutti i comandi nella transazione insieme:

redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
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++ in 21 days"
3) (intero) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

L'esecuzione di un comando Redis singolo è atomica, ma Redis non ha aggiunto alcun meccanismo per mantenere l'atomicità nelle transazioni, quindi l'esecuzione delle transazioni Redis non è atomica.

Le transazioni possono essere considerate come uno script di esecuzione batch pacchettizzato, ma i comandi batch non sono operazioni atomiche; il fallimento di un comando in mezzo non causerebbe il rollback dei comandi eseguiti in precedenza né influenzerà i comandi successivi.

Questa è la spiegazione sul sito ufficiale  Dal documento di Redis transazioni:

È importante notare che anche quando un comando fallisce, tutti gli altri comandi nella coda vengono elaborati - Redis non interrompe l'elaborazione dei comandi.

例如:

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 被其他命令所改动,那么事务将被打断。