redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解
redis事務(wù)
注意:我使用的版本是6.0.10,不同版本可能略有差別
redis事務(wù)就是一組命令的集合,一個事務(wù)中所有命令都會序列化,按順序的串行化執(zhí)行而不會被其他命令插入
- Redis的事務(wù)僅僅是保證事務(wù)里的操作會被連續(xù)獨占的執(zhí)行,因為是單線程架構(gòu),在執(zhí)行完事務(wù)內(nèi)所有指令前是不可能再去同時執(zhí)行其他客戶端的請求的
- Redis的事務(wù)沒有隔離級別的概念,因為事務(wù)提交前任何指令都不會被實際執(zhí)行,也就不存在事務(wù)內(nèi)的查詢要看到事務(wù)里的更新,在事務(wù)外查詢不能看到這種問題了
- Redis的事務(wù)不保證原子性,也就是不保證所有指令同時成功或同時失敗,只有決定是否開始執(zhí)行全部指令的能力,沒有執(zhí)行到一半進行回滾的能力
事務(wù)的常用命令
- multi 標記一個事務(wù)塊的開始,后續(xù)命令逐個放入隊列中
- exec 執(zhí)行事務(wù)塊的命令
- discard 取消事務(wù),丟棄事務(wù)塊的命令
- watch key [key ...] 監(jiān)視key,如果在事務(wù)執(zhí)行之前,這個key被其他命令所改動,則事務(wù)中斷
- unwatch 取消監(jiān)視所有key
事務(wù)的執(zhí)行
#標注事務(wù)的開始 MULTI OK #在事務(wù)內(nèi)部的操作全是入隊,不會真正執(zhí)行 set tran1 v1 QUEUED set tran2 v2 QUEUED #執(zhí)行 exec 1) OK 2) OK
redis的事務(wù)沒有隔離級別的概念,并且不會保證原子性
- 如果任何一個命令語法有錯,Redis會直接返回錯誤,所有的命令都不會執(zhí)行
- 如果某個命令執(zhí)行錯誤,那么其它的命令仍然會正常執(zhí)行,然后在執(zhí)行后返回錯誤信息
- Redis不提供事務(wù)回滾的功能,開發(fā)者必須在事務(wù)執(zhí)行出錯后,自行恢復(fù)數(shù)據(jù)庫狀態(tài)
watch監(jiān)視
watch指令類似于樂觀鎖,在事務(wù)開始之前使用,如果在watch之后有任何所監(jiān)視的key發(fā)生變化,exec指令所執(zhí)行的事務(wù)將會被放棄,當 EXEC 被調(diào)用后,所有的之前被監(jiān)視的鍵值會被取消監(jiān)視,不管事務(wù)是否被取消或者執(zhí)行。并且當客戶端連接丟失的時候,所有東西都會被取消監(jiān)視
#設(shè)值 set balance 100 OK #監(jiān)視 watch balance OK #修改 set balance 200 OK get balance "200" #開啟事務(wù) MULTI OK #修改入隊 DECRBY balance 10 QUEUED #執(zhí)行失敗 exec (nil) get balance "200"
redis只能保證事務(wù)中的操作順序執(zhí)行,但是如果事務(wù)中有一條命令失敗了,并不會回滾其他命令
以上就是redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解的詳細內(nèi)容,更多關(guān)于redis事務(wù)執(zhí)行watch監(jiān)視的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis 多規(guī)則限流和防重復(fù)提交方案實現(xiàn)小結(jié)
本文主要介紹了Redis 多規(guī)則限流和防重復(fù)提交方案實現(xiàn)小結(jié),包括使用String結(jié)構(gòu)和Zset結(jié)構(gòu)來記錄用戶IP的訪問次數(shù),具有一定的參考價值,感興趣的可以了解一下2025-02-02
多維度深入分析Redis的5種基本數(shù)據(jù)結(jié)構(gòu)
此篇文章主要對Redis的5種基本數(shù)據(jù)類型,即字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted?Set),從使用場景和底層結(jié)構(gòu)出發(fā),進行多維度深入分析。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11

