Redis的基礎事務及事務回滾

1 Redis的基礎事務及常用操作

和其他大部分的 NoSQL 不同,Redis 是存在事務的,儘管它沒有數據庫那麼強大,但是它還是很有用的,尤其是在那些需要高併發的網站當中。

使用 Redis 讀/寫數據要比數據庫快得多,如果使用 Redis 事務在某種場合下去替代數據庫事務,則可以在保證數據一致性的同時,大幅度提高數據讀/寫的響應速度。

細心的讀者也許可以發現筆者一直都很強調性能,因爲互聯網和傳統企業管理系統不一樣,互聯網系統面向的是公衆,很多用戶同時訪問服務器的可能性很大,尤其在一些商品搶購、搶紅包等場合,對性能和數據的一致性有着很高的要求,而存儲系統的讀/寫響應速度對於這類場景的性能的提高是十分重要的。

在 Redis 中,也存在多個客戶端同時向 Redis 系統發送命令的併發可能性,因此同一個數據,可能在不同的時刻被不同的線程所操縱,這樣就出現了併發下的數據一致的問題。爲了保證異性數據的安全性,Redis 爲提供了事務方案。而 Redis 的事務是使用 MULTI-EXEC 的命令組合,使用它可以提供兩個重要的保證:

  • 事務是一個被隔離的操作,事務中的方法都會被 Redis 進行序列化並按順序執行,事務在執行的過程中不會被其他客戶端發生的命令所打斷。
  • 事務是一個原子性的操作,它要麼全部執行,要麼就什麼都不執行。

在一個 Redis 的連接中,請注意要求是一個連接,所以更多的時候在使用 Spring 中會使用 SessionCallback 接口進行處理,在 Redis 中使用事務會經過 3 個過程:

  • 開啓事務。
  • 命令進入隊列。
  • 執行事務。

先來學習 Redis 事務命令,如表 1 所示。

命令 說明 備註
multi 開啓事務命令,之後的命令就進入隊列,而不會馬上被執行 在事務生存期間,所有的 Redis 關於數據結構的命令都會入隊
watch key1 [key2…] 監聽某些鍵,當被監聽的鍵在事務執行前被修改,則事務會被回滾 使用樂觀鎖
unwatch key1 [key2…] 取消監聽某些鍵 ----
exec 執行事務,如果被監聽的鍵沒有被修改,則採用執行命令,否則就回滾命令 在執行事務隊列存儲的命令前,Redis 會檢測被監聽的鍵值對有沒有發生變化,如果沒有則執行命令, 否則就回滾事務
discard 回滾事務 回滾進入隊列的事務命令,之後就不能再用 exec 命令提交了

在 Redis 中開啓事務是 multi 命令,而執行事務是 exec 命令multi 到 exec 命令之間的 Redis 命令將採取進入隊列的形式,直至 exec 命令的出現,纔會一次性發送隊列裏的命令去執行,而在執行這些命令的時候其他客戶端就不能再插入任何命令了,這就是 Redis 的事務機制。|

2 Redis事務回滾

對於 Redis 而言,不單單需要注意其事務處理的過程,其回滾的能力也和數據庫不太一樣,這也是需要特別注意的一個問題——Redis 事務遇到的命令格式正確而數據類型不符合

在執行事務命令的時候,在命令入隊的時候,Redis 就會檢測事務的命令是否正確,如果不正確則會產生錯誤。無論之前和之後的命令都會被事務所回滾,就變爲什麼都沒有執行。

當命令格式正確,而因爲操作數據結構引起的錯誤,則該命令執行出現錯誤,而其之前和之後的命令都會被正常執行。這點和數據庫很不一樣,這是需要讀者注意的地方

對於一些重要的操作,我們必須通過程序去檢測數據的正確性,以保證 Redis 事務的正確執行,避免出現數據不一致的情況。Redis 之所以保持這樣簡易的事務,完全是爲了保證移動互聯網的核心問題——性能。

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