Redis事务与监控
生活随笔
收集整理的這篇文章主要介紹了
Redis事务与监控
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
事務(wù)
- Redis單條命令是保證原子性的,但是事務(wù)不保證原子性的
- Redis事務(wù)沒(méi)有隔離級(jí)別的概念
- 所有的命命令在事務(wù)中, 并沒(méi)有直接被執(zhí)行, 只有發(fā)起執(zhí)行命令的時(shí)候才會(huì)被執(zhí)行
Redis 事務(wù)的本質(zhì): 一組命令的集合 一個(gè)事務(wù)中的所有命令都會(huì)被序列化, 在事務(wù)執(zhí)行過(guò)程中, 會(huì)按照順序執(zhí)行
一次性 順序性 排他性 執(zhí)行一系列的命令
Redis的事務(wù):
- 開(kāi)啟事務(wù)(multi)
- 命令入隊(duì)(…)
- 執(zhí)行事務(wù)(exec)
正常執(zhí)行事務(wù)
127.0.0.1:6379> multi # 開(kāi)啟事務(wù) OK # 命令入隊(duì) 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 # 執(zhí)行事務(wù) 127.0.0.1:6379> exec 1) OK 2) OK 3) "v2" 4) OK 127.0.0.1:6379>放棄事務(wù)
127.0.0.1:6379> multi # 開(kāi)啟事務(wù) OK 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> discard # 取消事務(wù) OK 127.0.0.1:6379> get k4 # 事務(wù)隊(duì)列中的命令都不會(huì)執(zhí)行 (nil)編譯型異常
(代碼有錯(cuò)誤 命令有錯(cuò)誤)
事務(wù)中的所有命令都不會(huì)被執(zhí)行
運(yùn)行時(shí)異常
如果事務(wù)隊(duì)列中存在語(yǔ)法性錯(cuò)誤, 那么執(zhí)行命令的時(shí)候, 其他命令是可以正常執(zhí)行的, 錯(cuò)誤命令拋出異常
127.0.0.1:6379> set k1 "v1" OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr k1 # 會(huì)在執(zhí)行的時(shí)候失敗 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 # 雖然第一條命令報(bào)錯(cuò)了, 但是依舊正常執(zhí)行成功了 1) (error) ERR value is not an integer or out of range 2) OK 3) OK 4) "v3" 127.0.0.1:6379>監(jiān)控 Watch
悲觀鎖
- 很悲觀, 認(rèn)為什么時(shí)候都會(huì)出現(xiàn)問(wèn)題, 無(wú)論做什么都會(huì)加鎖.
樂(lè)觀鎖
- 很樂(lè)觀, 認(rèn)為什么時(shí)候都不會(huì)出現(xiàn)問(wèn)題, 所以不會(huì)加鎖. 更新數(shù)據(jù)的時(shí)候去判斷一下, 在此期間是否有人修改過(guò)這個(gè)數(shù)據(jù)
- 獲取version
- 更新時(shí)比較version
Redis監(jiān)視測(cè)試
正常執(zhí)行成功
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 # 監(jiān)視money對(duì)象 OK 127.0.0.1:6379> multi # 事務(wù)正常結(jié)束, 數(shù)據(jù)期間沒(méi)有發(fā)生變動(dòng), 這個(gè)時(shí)候就正常執(zhí)行成功 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>測(cè)試多線程修改值, 監(jiān)視失敗, 使用watch可以當(dāng)作redis樂(lè)觀鎖操作
線程一
127.0.0.1:6379> watch money # 監(jiān)視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 # 執(zhí)行事務(wù)之前在, 另外一個(gè)線程, 修改了我們的值, 就會(huì)導(dǎo)致事務(wù)執(zhí)行失敗. (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 # 如果發(fā)現(xiàn)事務(wù)執(zhí)行失敗, 就先解鎖 OK 127.0.0.1:6379> watch money # 獲取新的值, 再次監(jiān)視, 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 # 比對(duì)監(jiān)視的值是否發(fā)生變化, 如果沒(méi)有變化, 執(zhí)行成功, 如果執(zhí)行失敗, 那么就繼續(xù) 先解鎖 -》 獲取新值再次監(jiān)視...... 1) (integer) 999 2) (integer) 1000 127.0.0.1:6379>- 如果發(fā)現(xiàn)事務(wù)執(zhí)行失敗, 就先解鎖
- 獲取新的值, 再次監(jiān)視, select version
- 比對(duì)監(jiān)視的值是否發(fā)生變化, 如果沒(méi)有變化, 執(zhí)行成功, 如果執(zhí)行失敗, 那么就繼續(xù) 先解鎖 -》 獲取新值再次監(jiān)視…
更多精彩 關(guān)注 微信公眾號(hào) 全棧自學(xué)社區(qū)
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Redis事务与监控的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis三种特殊数据类型
- 下一篇: github怎么删除已经发布的Relea