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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis事务与监控

發布時間:2024/9/30 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis事务与监控 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

事務

  • Redis單條命令是保證原子性的,但是事務不保證原子性的
  • Redis事務沒有隔離級別的概念
  • 所有的命命令在事務中, 并沒有直接被執行, 只有發起執行命令的時候才會被執行

Redis 事務的本質: 一組命令的集合 一個事務中的所有命令都會被序列化, 在事務執行過程中, 會按照順序執行
一次性 順序性 排他性 執行一系列的命令

----- 隊列set set set 執行-----

Redis的事務:

  • 開啟事務(multi)
  • 命令入隊(…)
  • 執行事務(exec)

正常執行事務

127.0.0.1:6379> multi # 開啟事務 OK # 命令入隊 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED # 執行事務 127.0.0.1:6379> exec 1) OK 2) OK 3) "v2" 4) OK 127.0.0.1:6379>

放棄事務

127.0.0.1:6379> multi # 開啟事務 OK 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> discard # 取消事務 OK 127.0.0.1:6379> get k4 # 事務隊列中的命令都不會執行 (nil)

編譯型異常

(代碼有錯誤 命令有錯誤)
事務中的所有命令都不會被執行

127.0.0.1:6379> multi OK 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> getset k3 # 錯誤的命令 (error) ERR wrong number of arguments for 'getset' command 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> set k5 v5 QUEUED 127.0.0.1:6379> exec # 執行的時候報錯 (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get k5 # 所有的命令都不會被執行 (nil) 127.0.0.1:6379>

運行時異常

如果事務隊列中存在語法性錯誤, 那么執行命令的時候, 其他命令是可以正常執行的, 錯誤命令拋出異常

127.0.0.1:6379> set k1 "v1" OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr k1 # 會在執行的時候失敗 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> get k3 QUEUED 127.0.0.1:6379> exec # 雖然第一條命令報錯了, 但是依舊正常執行成功了 1) (error) ERR value is not an integer or out of range 2) OK 3) OK 4) "v3" 127.0.0.1:6379>

監控 Watch

悲觀鎖

  • 很悲觀, 認為什么時候都會出現問題, 無論做什么都會加鎖.

樂觀鎖

  • 很樂觀, 認為什么時候都不會出現問題, 所以不會加鎖. 更新數據的時候去判斷一下, 在此期間是否有人修改過這個數據
  • 獲取version
  • 更新時比較version

Redis監視測試

正常執行成功

127.0.0.1:6379> set money 100 OK 127.0.0.1:6379> set out 0 OK 127.0.0.1:6379> watch money # 監視money對象 OK 127.0.0.1:6379> multi # 事務正常結束, 數據期間沒有發生變動, 這個時候就正常執行成功 OK 127.0.0.1:6379> decrby money 20 QUEUED 127.0.0.1:6379> incrby out 20 QUEUED 127.0.0.1:6379> exec 1) (integer) 80 2) (integer) 20 127.0.0.1:6379>

測試多線程修改值, 監視失敗, 使用watch可以當作redis樂觀鎖操作

線程一

127.0.0.1:6379> watch money # 監視money OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby money 10 QUEUED 127.0.0.1:6379> incrby out 10 QUEUED 127.0.0.1:6379> exec # 執行事務之前在, 另外一個線程, 修改了我們的值, 就會導致事務執行失敗. (nil) 127.0.0.1:6379>

線程二

127.0.0.1:6379> get money "80" 127.0.0.1:6379> set money 1000 OK 127.0.0.1:6379>

解決方案

127.0.0.1:6379> unwatch # 如果發現事務執行失敗, 就先解鎖 OK 127.0.0.1:6379> watch money # 獲取新的值, 再次監視, select version OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby money 1 QUEUED 127.0.0.1:6379> incrby money 1 QUEUED 127.0.0.1:6379> exec # 比對監視的值是否發生變化, 如果沒有變化, 執行成功, 如果執行失敗, 那么就繼續 先解鎖 -》 獲取新值再次監視...... 1) (integer) 999 2) (integer) 1000 127.0.0.1:6379>
  • 如果發現事務執行失敗, 就先解鎖
  • 獲取新的值, 再次監視, select version
  • 比對監視的值是否發生變化, 如果沒有變化, 執行成功, 如果執行失敗, 那么就繼續 先解鎖 -》 獲取新值再次監視…

更多精彩 關注 微信公眾號 全棧自學社區

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Redis事务与监控的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。