Redis學習手冊12—流水線與事務

流水線

Redis的流水線特性:這個特性允許客戶端把任意多條Redis命令請求打包在一起,然後一次性的全部發送給服務器,而服務器則會在流水線包含的所有命令請求處理完畢之後,一次性的將它們的執行結果全部返回給客戶端。

通過使用流水線特性,我們可以將執行多條命令所需的網絡通信次數從 NN 次降低到 1 次,這可以大幅度減少程序在網絡通信方面耗費的時間,使得程序的執行效率得到顯著的提升。

事務

Redis事務保障了多條命令執行的情況下,要麼全部執行成功,要麼全都不執行。

MULTI:開啓事務

使用MULTI命令可以開啓Redis事務支持。一般情況下除了少數阻塞命令外,Redis命令總會立即執行,但是當開啓事務後,所有輸入的命令都不會立即執行,而是按順序放入一個事務隊列中,等待事務執行時再統一執行。

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET test "hello world"
QUEUED
127.0.0.1:6379> SADD fruits "apple" "banana" "cherry"
QUEUED

如上所示,服務器在客戶端發送的命令放入事務隊列之後,會返回一個 QUEUED 作爲結果。

EXEC:執行事務

在使用 MULTI 命令開啓事務並將任意多個命令放入事務隊列之後,用戶就可以使用 EXEC命令來執行事務了:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET test "hello world"
QUEUED
127.0.0.1:6379> SADD fruits "apple" "banana" "cherry"
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 3

當事務成功執行時,EXEC命令將返回一個列表作爲結果,這個列表會按照命令的入隊順序依次包含各個命令的執行結果。

DISCARD:放棄事務

如果用戶在開啓事務之後,不想執行事務了,則可以使用如下命令放棄事務:

DISCARD

事務的安全性

人們一般都會根據數據庫的ACID性質的支持程度去判斷數據庫的事務是否安全。
具體來說,Redis的事務總是具有ACID性質中的ACI性質:

  • 原子性(Atomic):如果事務成功執行,那麼事務中包含的所有命令都會被執行;相反,如果事務執行失敗,那麼事務中包含的所有命令都不會被執行。
  • 一致性(Consistent):Redis服務器會對事務及其包含的命令進行檢查,確保無論事務是否執行成功,事務本身都不會對數據庫造成破壞。
  • 隔離性(Isolate):每個Redis客戶端都擁有自己獨立的事務隊列,並且每個Redis事務都是獨立執行的,不同事務之間不會互相干擾。

除此之外,當Redis服務器運行在持久化模式之下時,Redis的事務也具有ACID中的D性質:

  • 持久性(Durable):當事務執行完畢時,它的結果將被存儲到硬盤中,即使服務器在此之後停機,事務對數據庫所做的修改也不會丟失。

因爲事務在執行時會獨佔服務器,所以用戶應該避免在事務中執行過多命令,更不要將一些需要大量計算的命令放入事務中,以免造成服務器阻塞。

WATCH:對鍵進行監視

客戶端可以通過執行 WATCH 命令,要求服務器對一個或多個數據庫鍵進行監視,如果在客戶端嘗試執行事務之前,這些鍵的值發生了變化,那麼服務器將拒絕執行客戶端發送的事務,並向它返回空值:

WATCH key [key ... ]

127.0.0.1:6379> WATCH msg
OK
127.0.0.1:6379> GET msg
"hello world"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET user::1::email "[email protected]"
QUEUED
127.0.0.1:6379> SET msg "hello redis"
QUEUED
127.0.0.1:6379> EXEC
(nil)   -- msg鍵已被修改

UNWATCH:取消對鍵的監視

使用UNWATCH命令可以取消對鍵的監視:

UNWATCH

上一篇:Redis學習手冊11—自動過期

下一篇:Redis學習手冊13—Lua腳本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章