redis事務 1.redis事務介紹 redis的事務可以理解為一系列串列命令的集合。redis的事務和單條命令一樣,都是redis的最小執行單位,因此一個事務內的命令,要麼全部執行,要麼全部不執行。事務的概念對於熟悉資料庫的人們並不陌生,而redis作為一個資料庫系統,必然會對事務進行一定的支持 ...
redis事務
1.redis事務介紹
redis的事務可以理解為一系列串列命令的集合。redis的事務和單條命令一樣,都是redis的最小執行單位,因此一個事務內的命令,要麼全部執行,要麼全部不執行。事務的概念對於熟悉資料庫的人們並不陌生,而redis作為一個資料庫系統,必然會對事務進行一定的支持。
redis實現事務的方式簡單來說是將一系列的命令先保存在一個隊列中,然後交給redis串列化的順序執行。
2.redis事務常用命令
2.1 MULTI(開啟事務)
MULTI命令:用於開啟redis事務。在同一個客戶端內,一旦開啟了事務,代表著進入了事務狀態,後續輸入的所有命令都將被加入事務命令隊列,而不是立即執行。
2.2 EXEC(提交事務)
EXEC命令:用於提交事務。提交事務代表著將當前事務命令隊列中的命令交給redis一併執行。
2.3 DISCARD(放棄事務)
DISCARD命令:用於放棄事務。放棄事務代表著銷毀當前事務命令隊列,不進行任何操作,同時當前客戶端退出事務狀態。
2.4 WATCH
WATCH命令:用於監視key的變化。由於redis支持多用戶,通常在執行事務的過程中,不希望其它的用戶修改我們正在操作的key。redis出於併發性能的考慮,不支持悲觀鎖的機制(通過阻塞或者報錯來阻止其它用戶修改上鎖的數據),而是採用了類似樂觀鎖的機制。redis提供了WATCH命令來實現事務的“檢查再設置”(CAS)行為,WATCH命令可以同時監聽多個key的變化,在事務執行過程中一旦發現被監聽的key被修改過,將會放棄執行事務,這時應該由用戶來進行重試。
2.5 UNWATCH
UNWATCH命令:用於解除WATCH狀態。UNWATCH之後,當前客戶端將解除所有的WATCH監聽。
3.redis事務—錯誤處理
在事務執行過程中可能會出現錯誤,redis將錯誤分為兩類區別對待。
3.1語法錯誤(編譯時錯誤)
語法錯誤,即redis執行的命令本身就是錯誤的,這類錯誤可以在事務真正執行之前就發現,例如參數不符合規範等。如同通用編程語言的編譯時錯誤,由於這樣的錯誤應當通過仔細的檢查來完全避免,因此,redis在發現事務中存在語法錯誤時,會放棄整個事務。
3.2非語法錯誤(運行時錯誤)
非語法錯誤,即redis無法在真正執行命令之前發現的錯誤。例如incr要求數據必須是數字類型,而是否是數字類型,取決於運行時的狀態。如同通用編程語言的運行時錯誤,由於這樣的錯誤通常無法避免,因此,redis在發現命令存在非語法錯誤時,不會影響事務中其它命令的正常執行。
4.redis事務和腳本
redis在2.6版本後提供了非常靈活的腳本功能。腳本和事務類似,同樣可以理解為一連串命令的執行,redis會將腳本一口氣串列的執行完。redis腳本比事務更加的強大,事務能完成的任務,腳本也能完成。但相對而言,比起編寫複雜的腳本,redis本身的事務特性是最簡單的。
5.redis事務總結
redis作為一款非關係型資料庫伺服器,對事務的支持是遠遠比不上傳統的關係型資料庫的。redis事務不支持回滾,對事務ACID特性的支持也不盡如人意。但正因為redis功能的簡單性,redis擁有極高的可用性。所以在實際業務選型時,應該揚長避短,不去過分依賴redis的事務特性,而是充分利用redis的高可用性,對於一些對事務要求很高的場合,轉而使用傳統的關係型資料庫來滿足需求。