Redis事務命令與原理

2022-07-11 00:21:14 字數 1551 閱讀 7598

開始事務

multi
在執行 multi 命令後,後面執行的非事務相關的命令都會被加入事務佇列,等待事務執行

執行事務

exec
執行 multi 和 exec 之間的命令,並統一返回

監視鍵

watch key [key ...]
監視乙個或多個鍵,如果監視的鍵的值發生了改變,那麼事務將不被執行,並且返回 nil。watch 命令必須在 multi 命令之前執行。

取消事務

discard
取消事務,清空事務佇列

multi 命令

當redis接收到multi命令時,就會將該客戶端標記為事務狀態。redis伺服器可以和多個客戶端連線,每個客戶端都有乙個對應的客戶端狀態結構來儲存這個客戶端的資訊,包括事務狀態,套接字描述符,輸入輸出緩衝區還有事務佇列等。當進入事務狀態後,這個客戶端發過來的非事務的命令都會加入到事務佇列等待事務執行,而事務相關的命令則會立即執行。

exec 命令

當接收到exec命令時,就會執行事務佇列中的所有命令,因為redis單執行緒執行命令,所以自然的執行這些命令時,不會穿插其他客戶端的命令。執行完這些命令後,將返回所有命令的執行結果,並且清空事務佇列,清空客戶端對鍵的監視,退出事務狀態。

discard 命令

當接收到discard命令時,直接清空事務佇列,清空客戶端對鍵的監視,退出事務狀態。

watch 命令

redis用字典(redis的字典用雜湊表實現,基本可以將字典看作雜湊表)來儲存監視的鍵和客戶端之間的關係,其中字典的鍵就是被監視的鍵名,字典的值是乙個鍊錶,每乙個節點存有客戶端狀態結構的指標。如下圖所示:

圖一client-1監視了鍵 "aaa" 和 "ccc",也就是執行了命令watch aaa ccc,client-2監視了鍵" bbb",也就是執行了命令watch bbb,client-3監視了鍵 "ccc",也就是執行了命令watch ccc。當乙個客戶端執行watch命令時,就會將這個客戶端的狀態結構指標新增到被監視的鍵所對應的鍊錶的末尾。

如果有客戶端對被監視的鍵執行了修改命令,比如對字串型別執行了set命令,對列表型別執行了lpush命令等。那麼就會找到監視這個鍵的客戶端列表,對他們做標記(這個標記就在客戶端狀態結構中),他們監視的鍵被修改了。然後等到執行exec時會做檢查,如果有這個標記就不執行事務直接返回 nil。

當執行了exec或者discard命令時,就會清空客戶端對鍵的監視(清空就是清除對所有鍵的監視),也就是將客戶端狀態結構指標從上圖的鍊錶中移除,執行unwatch也可以完成同樣的任務。

Redis事務原理分析

在redis的事務裡面,採用的是樂觀鎖,主要是為了提高效能,減少客戶端的等待。由幾個命令構成 watch,unwatch,multi,exec,discard。通過watch,可以實現cas操作。使用watch監聽一些鍵,然後去檢查鍵的值,然後根據鍵的值來決定是否還需要進行multi,如果鍵的值被改...

Redis 事務命令詳解與例子

redis 事務可以一次執行多個命令,並且帶有以下三個重要的保證 總結說 redis事務就是一次性 順序性 排他性的執行乙個佇列中的一系列命令。乙個事務從開始到執行會經歷以下三個階段 redis事務沒有隔離級別的概念 批量操作在傳送 exec 命令前被放入佇列快取,並不會被實際執行,也就不存在事務內...

Redis事務與監控

redis 事務的本質 一組命令的集合 乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行 一次性 順序性 排他性 執行一系列的命令 佇列set set set 執行 redis的事務 127.0.0.1 6379 multi 開啟事務 ok 命令入隊 127.0.0.1 6379 ...