Redis事务与监控
生活随笔
收集整理的這篇文章主要介紹了
Redis事务与监控
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
事務
- Redis單條命令是保證原子性的,但是事務不保證原子性的
- Redis事務沒有隔離級別的概念
- 所有的命命令在事務中, 并沒有直接被執行, 只有發起執行命令的時候才會被執行
Redis 事務的本質: 一組命令的集合 一個事務中的所有命令都會被序列化, 在事務執行過程中, 會按照順序執行
一次性 順序性 排他性 執行一系列的命令
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> 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事务与监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis三种特殊数据类型
- 下一篇: Redis 主从复制