【原】Redis事务管理
Redis高級篇
事務(wù)
MULTI,?EXEC,?DISCARD?and?WATCH命令用于保證Redis中的事務(wù)處理
?一個(gè)事務(wù)中的所有命令被序列化并串行執(zhí)行。
?事務(wù)的原子性。
用法
MULTI 進(jìn)入一個(gè)事務(wù),這個(gè)命令響應(yīng)“OK”。
EXEC開始執(zhí)行事務(wù)中的命令。
DISCARD將退出事務(wù)。
事務(wù)錯(cuò)誤處理
事務(wù)執(zhí)行可能出現(xiàn)兩種錯(cuò)誤:
- 在EXEC執(zhí)行前,命令不能正常添加到Queue中。例如,命令出現(xiàn)語法錯(cuò)誤等。
- 在EXEC執(zhí)行后,例如在string類型上進(jìn)行l(wèi)ist操作。
針對于第一種錯(cuò)誤,Client通常能看到,在執(zhí)行命令后響應(yīng)為“QUEUED”說明成功,否則失敗。
為什么Redis不支持事務(wù)回滾
如果你有使用過關(guān)系式數(shù)據(jù)庫的經(jīng)驗(yàn),那么“Redis 在事務(wù)失敗時(shí)不進(jìn)行回滾,而是繼續(xù)執(zhí)行余下的命令”這種做法可能會讓你覺得有點(diǎn)奇怪?。
原因如下:?
- Redis 命令只會因?yàn)殄e(cuò)誤的語法而失敗(這些問題不能在入隊(duì)時(shí)發(fā)現(xiàn)),或是命令用在了錯(cuò)誤類型的鍵上面:這也就是說,從實(shí)用性的角度來說,失敗的命令是由編程錯(cuò)誤造成的,而這些錯(cuò)誤應(yīng)該在開發(fā)的過程中被發(fā)現(xiàn),而不應(yīng)該出現(xiàn)在生產(chǎn)環(huán)境中。
- 因?yàn)椴恍枰獙貪L進(jìn)行支持,所以 Redis 的內(nèi)部可以保持簡單且快速。
有種觀點(diǎn)認(rèn)為 Redis 處理事務(wù)的做法會產(chǎn)生 bug ,然而需要注意的是,在通常情況下,回滾并不能解決編程錯(cuò)誤帶來的問題。舉個(gè)例子,如果你本來想通過INCR 命令將鍵的值加上 1 ,卻不小心加上了 2 ,又或者對錯(cuò)誤類型的鍵執(zhí)行了INCR,回滾是沒有辦法處理這些情況的鑒于沒有任何機(jī)制能避免程序員自己造成的錯(cuò)誤,并且這類錯(cuò)誤通常不會在生產(chǎn)環(huán)境中出現(xiàn),所以 Redis 選擇了更簡單、更快速的無回滾方式來處理事務(wù)
Discarding the command queue
DISCARD用來中止事務(wù)。
> SET foo 1 OK > MULTI OK > INCR foo QUEUED > DISCARD OK > GET foo "1"用check-and-set(CAS)優(yōu)化鎖
WATCH命令用來監(jiān)控更新事務(wù)的狀態(tài)。。
WATCH 關(guān)鍵字用來監(jiān)控為了keys的變化。在EXEC執(zhí)行前,如果監(jiān)控中的任一key發(fā)生變化,那么事務(wù)將會停止,并且EXEC將返回空表示事務(wù)失敗。例如,我們需要使key自增1(假設(shè)Redis沒有INCR),做法如下:
這種做法對于單個(gè)client沒有問題,可是對于多個(gè)client同時(shí)進(jìn)行操作的話,那么就有問題了。通過WATCH命令我們就能很好地解決這個(gè)問題:
WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC上面的代碼中,如果其它c(diǎn)lient修改了WATCH和EXEC之間的變量val,那么事務(wù)將會失敗。
WATCH
WATCH可理解為有條件的EXEC命令,也就是說如果要執(zhí)行事務(wù),那么必須是WATCHed的keys都沒有被其它c(diǎn)lient修改過,否則事務(wù)不執(zhí)行。
WATCH能被多次調(diào)用。
使用UNWATCH(無參數(shù))命令移除不需要監(jiān)控的keys。
使用WATCH實(shí)現(xiàn)ZPOP命令(原子型操作:從集合中移除score最低的元素)的功能
轉(zhuǎn)載于:https://www.cnblogs.com/yourarebest/p/5987562.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的【原】Redis事务管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: artTemplate
- 下一篇: 数据库查询语言笔记