国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Redis】Transaction(事務)

這篇具有很好參考價值的文章主要介紹了【Redis】Transaction(事務)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Redis】Transaction(事務),Redis,redis,緩存,數(shù)據(jù)庫,服務器

??前言

Redis事務是一個組有多個Redis命令的集合,這些命令可以作為一個原子操作來執(zhí)行。

Redis事務通常用于以下兩種情況:

  1. 保證操作的原子性:在多個命令的執(zhí)行過程中,如果有一個命令執(zhí)行失敗,整個事務都需要回滾(撤銷)到事務開始前的狀態(tài),確保數(shù)據(jù)的一致性。

  2. 實現(xiàn)樂觀鎖:通過在事務中監(jiān)視某些鍵,如果這些鍵在事務執(zhí)行之前被其他客戶端修改,則事務可以取消執(zhí)行,從而避免了出現(xiàn)死鎖或數(shù)據(jù)不一致的情況。

在Redis中,通過使用MULTI命令開始一個事務,然后將多個命令添加到事務中,最后使用EXEC命令來執(zhí)行這些命令。如果事務中的任何一個命令執(zhí)行失敗,可以使用DISCARD命令來取消事務,或者使用UNWATCH命令來取消對鍵的監(jiān)視。

Redis的與事務相關的命令說明:

  1. DISCARD:用于取消一個事務,放棄事務中所有未執(zhí)行的命令,并恢復到事務開始前的狀態(tài)。
  2. EXEC:用于執(zhí)行一個事務,將所有已組裝但未執(zhí)行的命令一次性執(zhí)行,并返回執(zhí)行結果。
  3. MULTI:用于組裝一個事務,將多個命令放入事務中,等待后續(xù)的EXEC命令來執(zhí)行這些命令。
  4. UNWATCH:用于取消對所有鍵的監(jiān)視,這個命令通常在使用WATCH命令監(jiān)視一些鍵時使用,以確保在執(zhí)行事務之前,這些鍵沒有被其他客戶端修改。
  5. WATCH:用于監(jiān)視一些鍵,一旦這些鍵在事務執(zhí)行之前被改變,則取消事務的執(zhí)行。這個命令通常與MULTI命令一起使用,用于實現(xiàn)類似于"樂觀鎖"的效果。

這些命令通常用于保證在Redis事務中的操作的原子性和一致性。通過將多個命令放入同一個事務中,可以確保這些命令作為一個整體一起執(zhí)行,并且在有其他客戶端對被監(jiān)視的鍵進行修改時,能夠適當?shù)靥幚頉_突和錯誤。

Redis 事務可以一次執(zhí)行多個命令, 并且?guī)в幸韵氯齻€重要的保證:

  1. 批量操作在發(fā)送 EXEC 命令前被放入隊列緩存。
  2. 收到 EXEC 命令后進入事務執(zhí)行,事務中任意命令執(zhí)行失敗,其余的命令依然被執(zhí)行。
  3. 在事務執(zhí)行過程,其他客戶端提交的命令請求不會插入到事務執(zhí)行命令序列中。

一個事務從開始到執(zhí)行會經(jīng)歷以下三個階段:

  1. 開始事務。
  2. 命令入隊。
  3. 執(zhí)行事務。

??DISCARD(取消事務,放棄執(zhí)行事務塊內的所有命令)

說明:

  • DISCARD命令是Redis事務的一部分,用于取消當前事務,恢復到事務開始前的狀態(tài)。
  • 使用DISCARD命令可以在事務執(zhí)行過程中取消事務,并且不會對已有的鍵值產(chǎn)生影響。

時間復雜度:

  • O(1)。

返回值:

  • 總是返回?OK?

以下是一個使用DISCARD命令的示例代碼:

127.0.0.1:6379> multi # 開始一個事務
OK
127.0.0.1:6379> set key1 "value1" # 添加一個SET命令到事務中
QUEUED
127.0.0.1:6379> set key2 "value2" # 添加另一個SET命令到事務中 
QUEUED
127.0.0.1:6379> discard # 取消事務,不執(zhí)行SET命令
OK
  • 在這個示例中,通過使用DISCARD命令,第一個SET和第二個SET命令不會生效,并且整個事務都被取消了。
  • 單個 Redis 命令的執(zhí)行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執(zhí)行并不是原子性的。
  • 事務可以理解為一個打包的批量執(zhí)行腳本,但批量指令并非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成后續(xù)的指令不做。

??EXEC(執(zhí)行所有事務塊內的命令)

說明:

  • EXEC命令是Redis事務的一部分,用于執(zhí)行事務中所有添加的命令。
  • 當使用EXEC命令時,事務中的所有命令將作為一個原子操作被執(zhí)行,如果有一個命令執(zhí)行失敗,整個事務將回滾到開始前的狀態(tài)。
  • 舉例:假如某個(某些) key 正處于 WATCH 命令的監(jiān)視之下,且事務塊中有和這個(或這些) key 相關的命令,那么 EXEC 命令只在這個(或這些) key 沒有被其他命令所改動的情況下執(zhí)行并生效,否則該事務被打斷終止。

時間復雜度:

  • 事務塊內所有命令的時間復雜度的總和。

返回值:

  • 事務塊內所有命令的返回值,按命令執(zhí)行的先后順序排列。
  • 當操作被打斷時,返回空值?nil?。

以下是一個使用EXEC命令的示例代碼:

# 事務被成功執(zhí)行


127.0.0.1:6379> MULTI
OK


127.0.0.1:6379> INCR userid
QUEUED


127.0.0.1:6379> INCR userid
QUEUED


127.0.0.1:6379> INCR userid
QUEUED

redis> PING
QUEUED

redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG


# 監(jiān)視 key ,且事務成功執(zhí)行

127.0.0.1:6379> WATCH lock lock_value
OK

127.0.0.1:6379> MULTI
OK

127.0.0.1:6379> SET lock "xiaojian"
QUEUED

127.0.0.1:6379> INCR lock_value
QUEUED

127.0.0.1:6379> EXEC
1) OK
2) (integer) 1


# 監(jiān)視 key ,且事務被打斷

127.0.0.1:6379> WATCH lock lock_value     # 監(jiān)視lock鍵 和 lock_value鍵
OK

127.0.0.1:6379> MULTI     # 開始一個事務
OK

127.0.0.1:6379> SET lock "mr"        # 就在這時,另一個客戶端修改了 lock 鍵的值,另一個客戶端修改 這個被監(jiān)視的 lock鍵,此時事務必定是失敗的!
QUEUED

127.0.0.1:6379> SET lock_value    # 此時就算 lock_value 沒被修改,事務失敗已成定局。
QUEUED

127.0.0.1:6379> EXEC                  # 因為 lock 被其他客戶端修改,事務自動取消執(zhí)行。
(nil)

??MULTI(標記一個事務塊的開始)

說明:

  • MULTI命令是Redis事務的一部分,用于開始一個新事務,并將后續(xù)的命令添加到這個事務中,直到使用EXEC命令執(zhí)行這些命令為止。
  • 事務塊內的多條命令會按照先后順序被放進一個隊列當中,最后由 EXEC 命令原子性(atomic)地執(zhí)行。
  • 使用MULTI命令可以將多個命令添加到事務中,并且可以在需要時使用DISCARD命令取消事務,或者使用EXEC命令執(zhí)行事務中的所有命令。

時間復雜度:

  • O(1)。

返回值:

  • 返回 OK 。

以下是一個使用MULTI命令的示例代碼:

127.0.0.1:6379> multi # 標記事務開始
OK
127.0.0.1:6379> set key1 value1  # 多條命令按順序入隊
QUEUED
127.0.0.1:6379> set key2 valus2
QUEUED
127.0.0.1:6379> exec # 執(zhí)行
1) OK
2) OK



  • 在這個示例中,通過使用MULTI命令,將兩個SET命令添加到事務中,使用EXEC命令執(zhí)行事務中的所有命令?;蛘呖梢允褂肈ISCARD命令取消事務,這樣兩個SET命令都不會被執(zhí)行。
  • MULTI命令是Redis事務的一個重要組成部分,用于開始一個新事務并將后續(xù)的命令添加到這個事務中。

??UNWATCH(取消 WATCH 命令對所有 key 的監(jiān)視)

說明:

  • UNWATCH命令是Redis事務的一部分,用于取消對所有鍵的監(jiān)視,這個命令通常在使用WATCH命令監(jiān)視一些鍵時使用,以確保在執(zhí)行事務之前,這些鍵沒有被其他客戶端修改。
  • 當使用UNWATCH命令時,Redis將取消對所有鍵的監(jiān)視,如果有其他客戶端在這些鍵上執(zhí)行了修改操作,也不會影響當前客戶端的事務執(zhí)行。
  • 如果在執(zhí)行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被執(zhí)行了的話,那么就不需要再執(zhí)行 UNWATCH 了。
  • 因為 EXEC 命令會執(zhí)行事務,因此 WATCH 命令的效果已經(jīng)產(chǎn)生了;而 DISCARD 命令在取消事務的同時也會取消所有對 key 的監(jiān)視,因此這兩個命令執(zhí)行之后,就沒有必要執(zhí)行 UNWATCH 了。

時間復雜度:

  • O(1)。

返回值:

  • 總是?OK?。

以下是一個使用UNWATCH命令的示例代碼:

127.0.0.1:6379> WATCH lock lock_value
OK

127.0.0.1:6379> UNWATCH
OK

??WATCH(監(jiān)視一個或多個key?,在事務執(zhí)行之前這個或這些 key 被其他命令所改動,那么事務將被打斷)

說明:

  • WATCH命令是Redis事務的一部分,用于監(jiān)視一些鍵,一旦這些鍵在事務執(zhí)行之前被其他客戶端修改,則事務會取消執(zhí)行,從而避免了出現(xiàn)死鎖或數(shù)據(jù)不一致的情況。
  • 當使用WATCH命令時,客戶端將開始監(jiān)視指定的鍵,如果這些鍵在其他客戶端上被修改,當前客戶端的事務將自動取消執(zhí)行。

時間復雜度:

  • O(1)。

返回值:

  • 總是返回?OK?。

以下是一個使用WATCH命令的示例代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-541477.html

127.0.0.1:6379> watch key1  # 監(jiān)視一個鍵  (注意:可以一條命令監(jiān)視多個鍵  如:WATCH key1 key2)

127.0.0.1:6379> watch key2  # 再監(jiān)視一個鍵  

127.0.0.1:6379> multi # 開始一個事務  

127.0.0.1:6379> set("key1", "value1")  # 在被監(jiān)視的鍵上進行SET操作  

127.0.0.1:6379> set("key2", "value2")  # 在被另外
  • 當使用WATCH命令監(jiān)視了兩個鍵后,開始一個新事務,并在被監(jiān)視的鍵上執(zhí)行SET操作,如果這些鍵在其他客戶端上被修改,事務會自動取消執(zhí)行。

到了這里,關于【Redis】Transaction(事務)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Redis如何保證緩存和數(shù)據(jù)庫一致性?

    現(xiàn)在我們在面向增刪改查開發(fā)時,數(shù)據(jù)庫數(shù)據(jù)量大時或者對響應要求較快,我們就需要用到Redis來拿取數(shù)據(jù)。 Redis:是一種高性能的內存數(shù)據(jù)庫,它將數(shù)據(jù)以鍵值對的形式存儲在內存中,具有讀寫速度快、支持多種數(shù)據(jù)類型、原子性操作、豐富的特性等優(yōu)勢。 優(yōu)勢: 性能極高

    2024年01月16日
    瀏覽(41)
  • Redis---數(shù)據(jù)庫和緩存如何保證一致性?

    用「讀 + 寫」請求的并發(fā)的場景來分析: 假如某個用戶數(shù)據(jù)在緩存中不存在,請求 A 讀取數(shù)據(jù)時從數(shù)據(jù)庫中查詢到年齡為 20,在未寫入緩存中時另一個請求 B 更新數(shù)據(jù)。它更新數(shù)據(jù)庫中的年齡為 21,并且清空緩存。這時請求 A 把從數(shù)據(jù)庫中讀到的年齡為 20 的數(shù)據(jù)寫入到緩存

    2024年01月24日
    瀏覽(27)
  • Redis如何保障緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性問題?

    Redis如何保障緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性問題?

    目錄 一.最經(jīng)典的數(shù)據(jù)庫加緩存的雙寫雙刪模式 二. 高并發(fā)場景下的緩存+數(shù)據(jù)庫雙寫不一致問題分析與解決方案設計 三、上面高并發(fā)的場景下,該解決方案要注意的問題 1.1 Cache Aside Pattern概念以及讀寫邏輯 (1)讀的時候,先讀緩存,緩存沒有的話,那么就讀數(shù)據(jù)庫,然后取

    2023年04月21日
    瀏覽(29)
  • Springboot+Redis:實現(xiàn)緩存 減少對數(shù)據(jù)庫的壓力

    Springboot+Redis:實現(xiàn)緩存 減少對數(shù)據(jù)庫的壓力

    ????歡迎光臨,終于等到你啦???? ??我是蘇澤,一位對技術充滿熱情的探索者和分享者。???? ??持續(xù)更新的專欄 Redis實戰(zhàn)與進階 本專欄講解Redis從原理到實踐 這是蘇澤的個人主頁可以看到我其他的內容哦???? 努力的蘇澤 http://suzee.blog.csdn.net/ ? 目錄 緩存如何實現(xiàn)?

    2024年03月24日
    瀏覽(19)
  • Redis數(shù)據(jù)庫 | 發(fā)布訂閱、主從復制、哨兵模式、緩存雪崩

    Redis數(shù)據(jù)庫 | 發(fā)布訂閱、主從復制、哨兵模式、緩存雪崩

    ??wei_shuo的個人主頁 ??wei_shuo的學習社區(qū) ??Hello World ! Redis 發(fā)布訂閱 (pub/sub) 是一種消息通信模式:發(fā)送者 (pub) 發(fā)送消息,訂閱者 (sub) 接收消息 Redis 客戶端可以訂閱任意數(shù)量的頻道 Redis主從復制是指在Redis中設置一個主節(jié)點(Master)和一個或多個從節(jié)點(Slave),

    2024年02月15日
    瀏覽(24)
  • 數(shù)據(jù)庫緩存服務——NoSQL之Redis配置與優(yōu)化

    數(shù)據(jù)庫緩存服務——NoSQL之Redis配置與優(yōu)化

    目錄 一、緩存概念 1.1 系統(tǒng)緩存 1.2 緩存保存位置及分層結構 1.2.1 DNS緩存 1.2.2 應用層緩存 1.2.3 數(shù)據(jù)層緩存 1.2.4 硬件緩存 二、關系型數(shù)據(jù)庫與非關系型數(shù)據(jù)庫 2.1 關系型數(shù)據(jù)庫 2.2 非關系型數(shù)據(jù)庫 2.3 關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫區(qū)別: 2.4 非關系型數(shù)據(jù)庫產(chǎn)生背景 2.5 總結

    2024年02月15日
    瀏覽(24)
  • Redis緩存MySQL數(shù)據(jù)庫存儲二者如何保證數(shù)據(jù)一致性

    在大型互聯(lián)網(wǎng)應用中,由于數(shù)據(jù)庫讀寫頻繁、壓力大等原因,我們通常會使用緩存來減少數(shù)據(jù)庫的訪問次數(shù),提高系統(tǒng)的性能。而Redis作為一個高性能的內存數(shù)據(jù)庫,成為了緩存的首選方案之一。但是,緩存和數(shù)據(jù)庫之間存在數(shù)據(jù)一致性的問題,如何解決這個問題呢?本文將

    2023年04月19日
    瀏覽(27)
  • redis面試題目-如何保證數(shù)據(jù)庫與緩存的數(shù)據(jù)一致性

    原視頻:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于緩存和數(shù)據(jù)庫是分開的,無法做到原子性的同時進行數(shù)據(jù)修改,可能出現(xiàn)緩存更新失敗,或者數(shù)據(jù)庫更新失敗的情況,這時候會出現(xiàn)數(shù)據(jù)不一致,影響前端業(yè)務 先更新數(shù)據(jù)庫,再更新緩存。緩

    2024年02月05日
    瀏覽(27)
  • Redis 緩存與數(shù)據(jù)庫雙寫不一致如何解決

    Redis緩存與數(shù)據(jù)庫雙寫不一致是一個常見的挑戰(zhàn),但可以通過一些方法來解決或減輕這種不一致性。以下是一些可能的解決方案: 事務處理: 在進行緩存和數(shù)據(jù)庫雙寫時,確保它們被包含在同一事務中。這可以通過使用支持事務的數(shù)據(jù)庫和Redis事務來實現(xiàn)。這樣,要么兩者同

    2024年01月21日
    瀏覽(24)
  • 如何保證Redis緩存和數(shù)據(jù)庫的一致性問題

    熟練掌握Redis緩存技術? 那么請問Redis緩存中有幾種讀寫策略,又是如何保證與數(shù)據(jù)庫的一致性問題 今天來聊一聊常用的三種緩存讀寫策略 首先我們來思考一個問題 寫 先更新緩存 再更新數(shù)據(jù)庫 首先如果緩存更新成功但數(shù)據(jù)庫更新失敗,會導致數(shù)據(jù)不一致的問題 其次當請求

    2024年02月14日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包