一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - Redis 事務知識點相關總結

Redis 事務知識點相關總結

2021-07-28 17:02AsiaYe Redis

這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下

Redis中的事務介紹
    MySQL中的事務大家都不陌生,Redis中的事務和MySQL中的事務不同,今天看下Redis事務中的一些知識點吧。

01 事務簡介

Redis中的事務使用multi、exec來標記,其中multi代表事務開始,exec代表事務結束,multi和exec之間的命令是原子順序執行的。下面是一個例子:

  1. 127.0.0.1:7397> multi
  2. OK
  3. 127.0.0.1:7397> set key_hello hello
  4. QUEUED
  5. 127.0.0.1:7397> set key_world world
  6. QUEUED
  7. 127.0.0.1:7397> exec
  8. 1) OK
  9. 2) OK

需要注意的是,命令執行的中間結果返回都是queued,也就是說放到了隊列里面,沒有真正執行。在exec之前,如果使用get命令來查看當前的key_hello或者key_world的值,是無法獲取到的。

02 命令錯誤導致的事務提交失敗,所有命令都不執行

如果調用API的時候,拼寫錯誤,則會造成整個事務無法執行,例如下面的例子:

  1. 127.0.0.1:7397> multi
  2. OK
  3. 127.0.0.1:7397> incr counter
  4. QUEUED
  5. 127.0.0.1:7397> sett key_a aa
  6. (error) ERR unknown command `sett`, with args beginning with: `key_a`, `aa`,
  7. 127.0.0.1:7397> exec
  8. (error) EXECABORT Transaction discarded because of previous errors.
  9. 127.0.0.1:7397> get counter
  10. "10"

可以看到,因為set拼寫錯誤,寫成了sett,整個事務內部的所有動作都失效。exec命令也報錯。

03 運行時錯誤導致數據錯誤

如果語法正確,但是在運行的時候出現了"運行時"錯誤,例如元素的類型和操作符不匹配,例如對字符型值進行自增操作,如下:

  1. 127.0.0.1:7397> get key_a
  2. "a"
  3. 127.0.0.1:7397> get key_b
  4. "b"
  5. 127.0.0.1:7397> multi
  6. OK
  7. 127.0.0.1:7397> incr key_a
  8. QUEUED
  9. 127.0.0.1:7397> set key_b bbb
  10. QUEUED
  11. 127.0.0.1:7397> exec
  12. 1) (error) ERR value is not an integer or out of range
  13. 2) OK
  14. 127.0.0.1:7397> get key_b
  15. "bbb"

對key_a進行自增這類錯誤,它的語法是正確的,但是由于key_a是字符型的,自增操作是不合適的,事務中還對key_b進行了賦值操作,在執行exec的時候,key_b的值是被修改的,從"b"變成了“bbb”。

04 丟棄事務

直接看例子,在執行的最后,使用discard關鍵字對事務進行丟棄,那么事務執行過程中產生的key是沒有值的。

  1. 127.0.0.1:7397> multi
  2. OK
  3. 127.0.0.1:7397> set key_aa aa
  4. QUEUED
  5. 127.0.0.1:7397> set key_bb bb
  6. QUEUED
  7. 127.0.0.1:7397> set key_cc cc
  8. QUEUED
  9. 127.0.0.1:7397> discard
  10. OK
  11. 127.0.0.1:7397> get key_aa
  12. (nil)
  13. 127.0.0.1:7397> get key_bb
  14. (nil)
  15. 127.0.0.1:7397> get key_cc
  16. (nil)

05 watch命令

有些場景中,需要在事務之前,確保事務中的key沒有被其他客戶端修改過,才執行事務,否則不執行事務,redis提供了watch命令來解決這類問題。

正確場景:

  1. 127.0.0.1:7397> watch key_a
  2. OK
  3. 127.0.0.1:7397> multi
  4. OK
  5. 127.0.0.1:7397> set key_a aaa
  6. QUEUED
  7. 127.0.0.1:7397> exec
  8. 1) OK
  9. 127.0.0.1:7397> get key_a
  10. "aaa"

使用watch監控key_a的值,在exec之前,key_a的值沒有被其他事務修改過,那么exec的結果是成功的。

錯誤場景:

  1. 127.0.0.1:7397> watch key_a
  2. OK
  3. 127.0.0.1:7397> get key_a
  4. "aaa"
  5. ----------------------------------------
  6. 此時在另外一個session上執行set key_a aaaaaa
  7. ----------------------------------------
  8. 127.0.0.1:7397> multi
  9. OK
  10. 127.0.0.1:7397> set key_a a
  11. QUEUED
  12. 127.0.0.1:7397> exec
  13. (nil)

在watch的過程中,其他session對key_a的值進行了修改,那么會造成exec執行失敗,返回nil

06 總結

1、Redis事務就是一次性、順序性、排他性的執行一個隊列中的一系列命令,分為三個過程:開始事務、命令入隊、執行事務。

2、Redis提供了簡單的事務,使用multi、exec、discard這三個命令來控制

3、exec命令前,所有的原子操作都被放在隊列中緩存,并不會真正執行

4、Redis事務不存在隔離級別的概念

5、事務中的單條命令是原子執行的,但是事務本身不保證原子性,沒有回滾機制

以上就是Redis 事務相關總結的詳細內容,更多關于Redis 事務的資料請關注服務器之家其它相關文章!

延伸 · 閱讀

精彩推薦
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
主站蜘蛛池模板: 欧美一级专区免费大片 | 小寡妇水真多好紧 | 成年女人毛片免费观看中文w | 日本黄色影院 | 久久免费国产视频 | 国内精品久久久久小说网 | 91混血大战上海双胞胎 | 亚洲老头老太hd | 边摸边吃奶玩乳尖视频 | 色播开心网 | 国产yw193.㎝m在线观看 | 国产99视频精品免费视频免里 | zoofilivideo杂交3d | 色综合久久天天综合 | 大伊香蕉精品视频一区 | 女人爽到喷水的视频免费 | 国产精品天天看天天爽 | 精品久久久久久亚洲 | 四虎永久网址在线观看 | 日本特级大片 | 男人与雌性宠物交啪啪小说 | 欧美色图日韩色图 | 国产二区视频在线观看 | 精品视频一区在线观看 | 欧美区在线 | 国产综合欧美日韩视频一区 | 亚洲欧美日韩国产一区图片 | 国产精品香蕉一区二区三区 | 无遮18禁在线永久免费观看挡 | 99精品视频在线观看re | 免费看隐私男生网站 | 亚洲va欧美va国产综合久久 | 欧美亚洲韩国 | 国产ab| poren黑人 | 久久棋牌评测 | 日韩高清成人毛片不卡 | 99re8在线精品视频免费播放 | 胸奶好大好紧好湿好爽 | 草草国产成人免费视频 | zoomkool最新版 |