樂觀鎖(Optimistic Lock),顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候回判斷一下再次期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量。
樂觀鎖策略:提交版本必須大于記錄當前版本才能執行更新(推薦學習:Redis視頻教程)
Redis對于事務只提供了非常有限的支持,其實更多地是試圖繞過問題。
首先,Redis對于同一事務中的一組操作,而不是立即執行,而是放入一個queue中,當執行到EXEC時,再一起執行。事務執行是全局獨占的,也就是同一時間只有一個事務被執行,中途不能被其它事務打斷。Redis用這種最簡單的、也是性能最差的方式避免了race condition。
其次,在Redis的事務中,如果有一個或多個操作失敗,其它操作仍然會成功,也就是說它根本沒有回滾機制。
這種方式會帶來很多嚴重的問題,其中之一是,無法先讀取某個數值后再進行依賴這個值的操作,因為放在一個事務里會被在同一個瞬間執行,不放在同一個事務里又會導致race condition。解決方法是使用WATCH,它會監視一個或多個變量,如果變量的值在調用WATCH以后和事務提交之前被別的事務修改過了,整個事務都會失敗。這類似于操作系統中的CAS(Compare and Set)。我不知道WATCH具體是怎么實現的,但是我推測它監控了指定變量的版本號。
即使有了WATCH,Redis的事務也是受到嚴重限制的。第一,它沒有實現讀數據時的一致性,因為WATCH對于讀操作不起作用。第二,它不支持回滾。第三,在對同一變量存在大量并發寫操作時,性能會非常差,因為每次提交事務時,WATCH監控的變量都已經被修改了,導致事務將多次提交失敗。但是,Redis本來就是一個KV類型的緩存引擎,要處理的是大量讀少量寫的場景,對一致性也沒有要求。
更多Redis相關技術文章,請訪問Redis數據庫使用入門教程欄目進行學習!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com