2023-06-09:什麼是Redis事務?原理是什麼?
答案2023-06-09:
Redis中的事務是以一組命令的形式出現的,這些命令被認為是最小的執行單位。事務可以保證在一個單獨獨立的隔離操作中執行所有命令,而且所有命令都會按照指定的順序經過序列化後被執行。在伺服器端執行事務的過程中,不受其他使用者端傳送給Redis的命令請求的干擾影響。
Redis 事務的注意點有哪些?
Redis事務的使用需要注意以下幾點:
1.Redis 事務不支援回滾,不能像 MySQL 的事務那樣可以選擇性地輸出。一旦命令提交給Redis,就會被執行,無法扔回到事務的起點。
2.Redis事務是原子執行的,要麼全部執行成功,要麼放棄執行。如果其中一個命令失敗,則整個事務都會失敗,但不會因為其中一個命令失敗而導致其他命令的執行效果不確定。
3.執行事務期間,Redis伺服器不會中斷執行,也不會被其他客戶機的請求干擾,這保證了事務操作期間的隔離性和原子性。
4.事務中的命令都是序列執行的,並且事務會盡量縮短命令合併的時間。如果有多個使用者端同時存取同一個命令,會根據請求的時間順序進行處理,避免了競爭和死鎖。
Redis 事務為什麼不支援回滾?
Redis事務執行期間不支援回滾的主要原因是為了避免增加複雜的實現邏輯和增加系統負擔。 Redis只能通過在事務提交前執行所有命令來保證原子性的特性。如果Redis支援回滾,則必須儲存事務執行前的狀態,並在回滾後重置狀態,這樣會增加顯著的儲存和計算負擔。
當命令執行期間發生語法錯誤等問題,Redis會在執行失敗時報錯,開發人員可以通過編寫程式碼來處理這些錯誤。但是出現嚴重問題時,如網路故障或硬體問題等,Redis仍然會執行已經提交的事務命令,此時資料可能會出現嚴重不一致,需要開發人員自行修復。
總之,雖然沒有回滾功能,但是Redis事務仍然是非常有用和實用的功能,能夠提供高效、快速和可靠的多命令操作。開發人員需謹慎處理錯誤處理方式和保證資料一致性,以獲得最佳實踐的體驗。
事務是一組操作或動作的集合,這些操作要麼全部執行,要麼全部不執行。在執行事務期間,可以保證隔離性和原子性,即在同一事務中執行的操作相互獨立,不受其他事務的干擾。如果其中一個操作發生錯誤,則僅回滾該事務,而不影響其他事務的執行結果。事務通常用於需要一系列操作來完成的任務,例如向資料庫中插入多個資料,或將多個操作組合成一個原子操作。
以社群網站上使用者A關注使用者B為例,這個動作需要在使用者A的關注表中新增使用者B,並在使用者B的粉絲表中新增使用者A。將這兩個操作組合成事務,可以確保在同一個事務中執行,要麼全部執行,要麼全部不執行。這樣可以避免出現資料不一致的情況,確保關注關係的正確性。使用事務可以將多個資料庫操作組合成一個原子操作,保證資料的一致性。
Redis提供了簡單的事務功能,以multi命令開始事務,並在呼叫exec命令結束事務。將需要一起執行的命令放在multi和exec之間,Redis會將這些命令作為一個原子操作來處理,要麼全部執行,要麼全部不執行。如果在事務執行期間需要取消已經執行的命令,可以使用discard命令回滾整個事務。利用Redis的事務功能,可以執行多個命令並確保它們在同一個事務中執行,避免了因單個命令執行失敗而導致的資料不一致問題。
一個使用者端
另外一個使用者端
在事務沒有提交的時查詢(查不到資料)
在事務提交後查詢(可以查到資料)
可以看到sadd命令此時的返回結果是QUEUED,代表命令並沒有真正執行,而是暫時儲存在Redis中的一個快取佇列(所以discard也只是丟棄這個快取佇列中的未執行命令,並不會回滾已經操作過的資料,這一點要和關係型資料庫的Rollback操作區分開)。
只有當exec執行後,使用者A關注使用者B的行為才算完成,如下所示exec返回的兩個結果對應sadd命令。
但是要注意Redis的事務功能很弱。在事務回滾機制上,Redis只能對基本的語法錯誤進行判斷。
如果事務中的命令出現錯誤,Redis 的處理機制也不盡相同。
1、語法命令錯誤
例如下面操作錯將set寫成了sett,屬於語法錯誤,會造成整個事務無法執行,事務內的操作都沒有執行:
2、執行時錯誤
例如:事務內第一個命令簡單的設定一個string型別,第二個對這個key進行sadd命令,這種就是執行時命令錯誤,因為語法是正確的:
可以看到Redis並不支援回滾功能,第一個set命令已經執行成功,開發人員需要自己修復這類問題。
Redis的事務是在伺服器端實現的,當用戶執行MULTI命令時,伺服器將對應的使用者端物件設定為一個專門的狀態,此狀態下所有後續使用者所執行的查詢命令都不會被立即執行,而是被儲存在一個事務佇列中,直到使用者執行EXEC命令為止。在執行EXEC命令前或在事務途中,使用者端可以隨時呼叫DISCARD命令來取消事務。當用戶執行EXEC命令時,伺服器會將該使用者端物件中快取的命令按照它們提交的順序依次執行,並將執行結果返回給使用者端。使用Redis事務可以將一系列命令作為單個原子操作執行,從而保證了操作的一致性。