最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis事務(wù),Redis實(shí)現(xiàn)悲觀鎖,樂觀鎖方式

 更新時(shí)間:2026年05月21日 09:08:36   作者:白鴿呀  
文章介紹了Redis事務(wù)的概念、特點(diǎn)和執(zhí)行過程,區(qū)別于MySQL事務(wù)的ACID特性,詳細(xì)講解了未授權(quán)讀取、授權(quán)讀取、重復(fù)讀取和串行化四種隔離級(jí)別,并解析了悲觀鎖和樂觀鎖的定義與應(yīng)用場(chǎng)景,最后闡述了Redis通過版本號(hào)實(shí)現(xiàn)樂觀鎖的機(jī)制

Redis 事務(wù)

redis 事務(wù)可以一次執(zhí)行多個(gè)命令,并帶有三個(gè)保證

  • exec命令執(zhí)行前,多個(gè)命令被放入隊(duì)列緩存
  • exec命令執(zhí)行后,緩存隊(duì)列中的命令順序執(zhí)行,一旦有一個(gè)有誤,不影響其它命令的執(zhí)行
  • 在事務(wù)執(zhí)行過程中,其它客戶端提交的命令請(qǐng)求不會(huì)插入到當(dāng)前的緩存命令隊(duì)列

redis事務(wù)執(zhí)行的三個(gè)階段

  • 開啟事務(wù)(multi)
  • 命令入隊(duì)(queue)
  • 執(zhí)行事務(wù)(exec)

redis事務(wù)和mysql事務(wù)是有區(qū)別的

  • redis 事務(wù)并不具有原子性,一旦事務(wù)中(命令隊(duì)列中)有一命令執(zhí)行失敗,并不影響整個(gè)事務(wù)的執(zhí)行
  • 但是redis單條命令具有原子性
  • mysql事務(wù)具有原子性,在一個(gè)事務(wù)中,多條命令,一旦有一條執(zhí)行失敗,其它全部失敗

實(shí)例:

redis事務(wù)

1、編譯時(shí)異常 ,在redis事務(wù)中,編譯時(shí)語法錯(cuò)誤,會(huì)導(dǎo)致整個(gè)事務(wù)都不能執(zhí)行

3、運(yùn)行時(shí)異常 ,在redis事務(wù)中,運(yùn)行時(shí)異常,運(yùn)行時(shí)報(bào)錯(cuò),但整體事務(wù)依舊能正常執(zhí)行

事務(wù)的ACID原則

事務(wù)具有4個(gè)特征,分別是原子性、一致性、隔離性和持久性,簡(jiǎn)稱事務(wù)的ACID特性;

一、原子性(atomicity)

一個(gè)事務(wù)要么全部提交成功,要么全部失敗回滾,不能只執(zhí)行其中的一部分操作,這就是事務(wù)的原子性

二、一致性(consistency)

事務(wù)的執(zhí)行不能破壞數(shù)據(jù)庫數(shù)據(jù)的完整性和一致性,一個(gè)事務(wù)在執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)庫都必須處于一致性狀態(tài)。

如果數(shù)據(jù)庫系統(tǒng)在運(yùn)行過程中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,這些未完成的事務(wù)對(duì)數(shù)據(jù)庫所作的修改有一部分已寫入物理數(shù)據(jù)庫,這是數(shù)據(jù)庫就處于一種不正確的狀態(tài),也就是不一致的狀態(tài)

三、隔離性(isolation)

事務(wù)的隔離性是指在并發(fā)環(huán)境中,并發(fā)的事務(wù)時(shí)相互隔離的,一個(gè)事務(wù)的執(zhí)行不能不被其他事務(wù)干擾。不同的事務(wù)并發(fā)操作相同的數(shù)據(jù)時(shí),每個(gè)事務(wù)都有各自完成的數(shù)據(jù)空間,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他并發(fā)事務(wù)時(shí)隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能相互干擾。

在標(biāo)準(zhǔn)SQL規(guī)范中,定義了4個(gè)事務(wù)隔離級(jí)別,不同的隔離級(jí)別對(duì)事務(wù)的處理不同,分別是:未授權(quán)讀取,授權(quán)讀取,可重復(fù)讀取和串行化

1、讀未提交(Read Uncommited),該隔離級(jí)別允許臟讀取,其隔離級(jí)別最低;比如事務(wù)A和事務(wù)B同時(shí)進(jìn)行,事務(wù)A在整個(gè)執(zhí)行階段,會(huì)將某數(shù)據(jù)的值從1開始一直加到10,然后進(jìn)行事務(wù)提交,此時(shí),事務(wù)B能夠看到這個(gè)數(shù)據(jù)項(xiàng)在事務(wù)A操作過程中的所有中間值(如1變成2,2變成3等),而對(duì)這一系列的中間值的讀取就是未授權(quán)讀取

2、授權(quán)讀取也稱為已提交讀(Read Commited),授權(quán)讀取只允許獲取已經(jīng)提交的數(shù)據(jù)。比如事務(wù)A和事務(wù)B同時(shí)進(jìn)行,事務(wù)A進(jìn)行+1操作,此時(shí),事務(wù)B無法看到這個(gè)數(shù)據(jù)項(xiàng)在事務(wù)A操作過程中的所有中間值,只能看到最終的10。另外,如果說有一個(gè)事務(wù)C,和事務(wù)A進(jìn)行非常類似的操作,只是事務(wù)C是將數(shù)據(jù)項(xiàng)從10加到20,此時(shí)事務(wù)B也同樣可以讀取到20,即授權(quán)讀取允許不可重復(fù)讀取。

3、可重復(fù)讀(Repeatable Read)

就是保證在事務(wù)處理過程中,多次讀取同一個(gè)數(shù)據(jù)時(shí),其值都和事務(wù)開始時(shí)刻是一致的,因此該事務(wù)級(jí)別禁止不可重復(fù)讀取和臟讀取,但是有可能出現(xiàn)幻影數(shù)據(jù)。所謂幻影數(shù)據(jù),就是指同樣的事務(wù)操作,在前后兩個(gè)時(shí)間段內(nèi)執(zhí)行對(duì)同一個(gè)數(shù)據(jù)項(xiàng)的讀取,可能出現(xiàn)不一致的結(jié)果。在上面的例子中,可重復(fù)讀取隔離級(jí)別能夠保證事務(wù)B在第一次事務(wù)操作過程中,始終對(duì)數(shù)據(jù)項(xiàng)讀取到1,但是在下一次事務(wù)操作中,即使事務(wù)B(注意,事務(wù)名字雖然相同,但是指的是另一個(gè)事務(wù)操作)采用同樣的查詢方式,就可能讀取到10或20;

4、串行化

是最嚴(yán)格的事務(wù)隔離級(jí)別,它要求所有事務(wù)被串行執(zhí)行,即事務(wù)只能一個(gè)接一個(gè)的進(jìn)行處理,不能并發(fā)執(zhí)行。

四、持久性(durability)

一旦事務(wù)提交,那么它對(duì)數(shù)據(jù)庫中的對(duì)應(yīng)數(shù)據(jù)的狀態(tài)的變更就會(huì)永久保存到數(shù)據(jù)庫中。–即使發(fā)生系統(tǒng)崩潰或機(jī)器宕機(jī)等故障,只要數(shù)據(jù)庫能夠重新啟動(dòng),那么一定能夠?qū)⑵浠謴?fù)到事務(wù)成功結(jié)束的狀態(tài)

鎖 (redis 實(shí)現(xiàn)悲觀鎖和樂觀鎖)

1、 什么是悲觀鎖和樂觀鎖?

  • 悲觀鎖:見名知意,很悲觀,擔(dān)心數(shù)據(jù)會(huì)被修改,對(duì)讀寫操作都上鎖,自己用完數(shù)據(jù)后,就會(huì)進(jìn)行解鎖。那么其它線程進(jìn)行操作時(shí)必須等待,效率相對(duì)較低。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖、表鎖、讀鎖、寫鎖等。都是在操作之前先上鎖讓別人無法操作該數(shù)據(jù)。
  • 樂觀鎖:顧名思義,很樂觀,每次取數(shù)據(jù)的時(shí)候并不擔(dān)心自己的數(shù)據(jù)會(huì)被修改。數(shù)據(jù)庫實(shí)現(xiàn)樂觀鎖,通常使用的是version(數(shù)據(jù)版本),來表示數(shù)據(jù)的。每次取數(shù)據(jù)的時(shí)候,連同數(shù)據(jù)版本version一起取出。當(dāng)讀取出數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行更改時(shí),會(huì)將數(shù)版本version 加一,然后提交到數(shù)據(jù)庫,此時(shí)比較數(shù)據(jù)版本version,如果提交的數(shù)據(jù)版本version大于當(dāng)前數(shù)據(jù)庫對(duì)應(yīng)記錄的數(shù)據(jù)版本version,那么提交成功。否則小于等于都會(huì)提交失敗。需要重新從數(shù)據(jù)庫取數(shù)據(jù)。

2、 樂觀鎖 和悲觀鎖的 應(yīng)用場(chǎng)景

  • 樂觀鎖適用于 頻繁讀取數(shù)據(jù)的場(chǎng)景,因?yàn)樽x取數(shù)據(jù)并不會(huì)上鎖。但是當(dāng)有大量數(shù)據(jù)寫入的時(shí)候,會(huì)頻繁的提交不成功,會(huì)重新讀取數(shù)據(jù),再提交。
  • 悲觀鎖適用于 頻繁寫入數(shù)據(jù)的場(chǎng)景,因?yàn)椴还苁亲x還是寫 都會(huì)上鎖,如果大量寫入數(shù)據(jù),為了數(shù)據(jù)安全上鎖是有必要的,相反樂觀鎖就會(huì)大量的讀取提交操作。但是當(dāng)有大量數(shù)據(jù)讀出的時(shí)候,效率低下。

3、 redis 實(shí)現(xiàn)樂觀鎖

  • redis通過watch實(shí)現(xiàn)樂觀鎖,當(dāng)對(duì)一個(gè)key進(jìn)行監(jiān)控的時(shí)候,客戶端A一個(gè)事務(wù)正在修改key,客戶端B已經(jīng)修改完了key。那么客戶端A的當(dāng)前事務(wù),全部執(zhí)行失敗。因?yàn)樵谑聞?wù)過程中,key的值已經(jīng)被修改,當(dāng)前事務(wù)discard(失敗),如果新開一個(gè)事務(wù)是在對(duì)key進(jìn)行操作是沒有問題的,并且不開啟事務(wù)直接執(zhí)行命令也是沒有問題的,因?yàn)閞edis單條命令具有原子性

客戶端A

客戶端B

? 一旦監(jiān)控的key的數(shù)據(jù)被另一客戶端修改,當(dāng)前客戶端 對(duì)key的事務(wù)操作全部執(zhí)行失敗。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Ubuntu下Redis密碼設(shè)置問題及其解決過程

    Ubuntu下Redis密碼設(shè)置問題及其解決過程

    這篇文章主要介紹了Ubuntu下Redis密碼設(shè)置問題及其解決過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Redis?整數(shù)集合的具體使用(intset)

    Redis?整數(shù)集合的具體使用(intset)

    對(duì)于集合,STL?的?set?相信大家都不陌生,本文主要介紹了整數(shù)集合,又稱為?intset,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 淺談Redis如何應(yīng)對(duì)并發(fā)訪問

    淺談Redis如何應(yīng)對(duì)并發(fā)訪問

    本文主要介紹了Redis如何應(yīng)對(duì)并發(fā)訪問,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Redis GEO實(shí)現(xiàn)搜索附近用戶的項(xiàng)目實(shí)踐

    Redis GEO實(shí)現(xiàn)搜索附近用戶的項(xiàng)目實(shí)踐

    RedisGEO主要用于存儲(chǔ)地理位置信息,并對(duì)存儲(chǔ)的信息進(jìn)行操作,本文主要介紹了Redis GEO實(shí)現(xiàn)搜索附近用戶的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Redis五種核心數(shù)據(jù)類型與命令示例

    Redis五種核心數(shù)據(jù)類型與命令示例

    本文介紹了Redis的五種核心數(shù)據(jù)類型:String、Hash、List、Set和SortedSet,每種類型都有其獨(dú)特的存儲(chǔ)結(jié)構(gòu)、應(yīng)用場(chǎng)景和時(shí)間復(fù)雜度,同時(shí),還提供了Java示例代碼和命令示例,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Redis中的Lettuce使用詳解

    Redis中的Lettuce使用詳解

    Lettuce 是一個(gè)高級(jí)的、線程安全的 Redis 客戶端,用于與 Redis 數(shù)據(jù)庫交互,Lettuce 是一個(gè)功能強(qiáng)大、使用方便的 Redis 客戶端,適用于各種規(guī)模的 Java 項(xiàng)目,下面給大家介紹Redis中的Lettuce使用詳解,感興趣的朋友一起看看吧
    2025-05-05
  • Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)

    Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄猂edis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 詳解redis緩存與數(shù)據(jù)庫一致性問題解決

    詳解redis緩存與數(shù)據(jù)庫一致性問題解決

    這篇文章主要介紹了詳解redis緩存與數(shù)據(jù)庫一致性問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • redis.clients.jedis.exceptions.JedisDataException異常的錯(cuò)誤解決

    redis.clients.jedis.exceptions.JedisDataException異常的錯(cuò)誤解決

    本文主要介紹了redis.clients.jedis.exceptions.JedisDataException異常的錯(cuò)誤解決,這個(gè)異常通常發(fā)生在嘗試連接到一個(gè)?Redis?服務(wù)器時(shí),客戶端發(fā)送了一個(gè)?AUTH?命令來驗(yàn)證密碼,但是沒有配置密碼驗(yàn)證,下來就來解決一下
    2024-05-05
  • 為啥Redis使用pipelining會(huì)更快

    為啥Redis使用pipelining會(huì)更快

    這篇文章主要介紹了為啥Redis使用pipelining會(huì)更快,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論

乐至县| 湘潭市| 延川县| 安徽省| 敖汉旗| 广饶县| 鄂托克旗| 芦山县| 夹江县| 谷城县| 台东市| 星座| 剑川县| 射洪县| 永安市| 当涂县| 且末县| 惠水县| 贡觉县| 武鸣县| 盐边县| 南京市| 永平县| 长丰县| 阿克苏市| 金堂县| 霍林郭勒市| 灵川县| 丰县| 余庆县| 滨海县| 红河县| 凌海市| 陕西省| 凌源市| 巴东县| 顺平县| 永新县| 廊坊市| 抚远县| 项城市|