<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Redis 作為記憶體的儲存中介軟體,已經是面試的面試題必問之一了,今天一起來看看 Redis 的事務吧。
事務提供了一種"將多個命令打包,一次性提交併按順序執行"的機制,提交後在事務執行中不會中斷。只有在執行完所有命令後才會繼續執行來自其他客戶的訊息。
Redis 通過 multi,exec,discard,watch 實現事務功能。
> multi OK > set bookName "Redis" QUEUED > get bookName QUEUED > sadd tag "Redis" "New Book" QUEUED > smembers tag QUEUED > exec 1) OK 2) "Redis" 3) (integer) 2 4) 1) "Redis" 2) "New Book"
> multi OK
這個命令將 Redis_multi 選項開啟,讓使用者端從非事務狀態變為事務狀態
> set bookName "Redis" QUEUED > get bookName QUEUED > sadd tag "Redis" "New Book" QUEUED > smembers tag QUEUED
在事務狀態中,Redis 命令並不是立即執行的,而是進入一個先進先出的事務佇列。QUEUED 表示這個命令已經入了事務佇列。
> exec 1) OK 2) "Redis" 3) (integer) 2 4) 1) "Redis" 2) "New Book"
當執行 exec 命令時,Redis 根據使用者端所儲存的事務佇列, 以先進先出的方式執行事務佇列中的命令:最先入隊的命令最先執行, 而最後入隊的命令最後執行。當 exec 命令執行完畢時,Redis 會將結果儲存到一個回覆佇列,並將回覆佇列返回給使用者端。使用者端從事務狀態退出,一個事務執行完畢。
> multi OK > set author "lisi" QUEUED > discard OK > get author (nil)
discard 取消一個事務的命令,表示這個事務被取消。使用者端從事務狀態退出,回到非事務狀態,Redis_multi 選項關閉。
# Redis 使用者端1 > watch letter OK > multi OK > set letter a QUEUED > exec (nil) # Redis 使用者端2 > set letter b OK # Redis 使用者端1 > get letter "b"
設定監控 letter 鍵,使用者端1進入事務,設定 letter 的 value 為 a,未提交事務。使用者端2設定 letter 的 value 為 b。回到使用者端1提交事務返回的結果為 nil,呼叫 get 命令得到 letter 為 b。這說明當 letter 鍵在其他使用者端改變後,事務被取消了,不會被執行,返回失敗。
watch 命令在事務開始之前監視任意數量的鍵:當呼叫 exce 命令執行事務時,如果任意一個被監視的鍵已經被其他使用者端修改了,那麼整個事務不再執行,直接返回失敗。
> set letter ac QUEUED > get letter ac (error) ERR wrong number of arguments for 'get' command > exec (error) EXECABORT Transaction discarded because of previous errors.
事務中命令異常屬於語法錯誤,將導致事務無法執行。
> multi OK > lpush books "Redis" QUEUED > incr books QUEUED > lpush books "Python" QUEUED > lrange books 0 -1 QUEUED > exec 1) (integer) 1 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) (integer) 2 4) 1) "Python" 2) "Redis"
上面的例子是事務執行到中間遇到失敗了,因為不能對一個字串進行 incr 命令,事務在遇到命令執行失敗後,後續的命令還繼續執行,所以 books 的值能繼續得到設定。這種異常只有程式設計師在程式碼中避免。
原子意味著要麼一起成功執行,要麼一起失敗回滾。Redis 提供的所有 API 都是原子操作。那麼 Redis 事務只要保證在一批操作中保證原子性,但是在執行時異常中,在一個事務中一個命令出現異常,其他命令還是會繼續執行,事務沒有回滾機制,所以 Redis 事務是不保證原子性的。
事務異常
如果命令錯誤事務無法執行,如果是執行時異常,Redis 會將錯誤包含在返回結果中,並不影響後續執行,所以事務是一致性的。
Redis 程序被終結
在純記憶體模式下,Redis 沒有做持久化,重啟之後資料庫是空白的,所以是事務一致性的。
在 RDB 模式下,事務並不會在中途執行儲存 RDB 檔案的工作,只有在事務執行完後,RDB 工作才可能會開始。所以在事務執行過程中 Redis 程序被殺死,不管成功多少都不會儲存到 RDB 檔案中,所以是一致性的。
在 AOF 模式下,事務部分語句被寫入 AOF 檔案並儲存成功,不完整的事務被儲存到了 AOF 檔案,當重啟 Redis 時,檢查 AOF 檔案不完整,Redis 退出並報錯。需要把這段不完整的事務刪除後才能重啟成功,所以是一致性的。
在 AOF 模式下,事務並未被寫入 AOF 檔案,所以重啟後 Redis 資料庫是最近一次成功儲存到 AOF 檔案中的資料。並沒有這次事務的資料,所以是以一致性的。
Redis 是單程序程式,並且它保證在執行事務時,不會對事務進行中斷,事務可以執行直到執行完所有事務佇列中的命令為止。所以事務是帶有隔離性的。
在純記憶體模式下,事務肯定不是持續性的。
在 RDB 模式下,伺服器可能在事務執行之後、RDB 檔案更新之前的這段時間失敗,所以 RDB 模式下的事務也是不持久的。
在 AOF 模式下,將命令新增到 AOF 檔案中,但是對檔案進行寫入並不會馬上寫到磁碟上,而是先儲存到緩衝區。所以資料儲存到磁碟上有一段非常小的時間間隔。這種模式下事務也不是持久的。
本文介紹了 Redis 的事務的 multi,exec,discard,watch 命令用法和 它的 ACID。
到此這篇關於一文教你學會Redis的事務的文章就介紹到這了,更多相關Redis事務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45