日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【原】Redis事务管理

發(fā)布時(shí)間:2025/3/15 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原】Redis事务管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)。

> MULTI OK > INCR foo QUEUED > INCR bar QUEUED > EXEC 1) (integer) 1 2) (integer) 1

事務(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),做法如下:

val = GET mykey val = val + 1 SET mykey $val

這種做法對于單個(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最低的元素)的功能

WATCH zset element = ZRANGE zset 0 0 MULTI ZREM zset element EXEC

轉(zhuǎn)載于:https://www.cnblogs.com/yourarebest/p/5987562.html

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的【原】Redis事务管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。