1、前言
為什么要構(gòu)建鎖呢?因?yàn)闃?gòu)建合適的鎖可以在高并發(fā)下能夠保持?jǐn)?shù)據(jù)的一致性,即客戶端在執(zhí)行連貫的命令時(shí)上鎖的數(shù)據(jù)不會(huì)被別的客戶端的更改而發(fā)生錯(cuò)誤。同時(shí)還能夠保證命令執(zhí)行的成功率。
看到這里你不禁要問redis中不是有事務(wù)操作么?事務(wù)操作不能夠?qū)崿F(xiàn)上面的功能么?
的確,redis中的事務(wù)可以watch可以監(jiān)控?cái)?shù)據(jù),從而能夠保證連貫執(zhí)行的時(shí)數(shù)據(jù)的一致性,但是我們必須清楚的認(rèn)識(shí)到,在多個(gè)客戶端同時(shí)處理相同的數(shù)據(jù)的時(shí)候,很容易導(dǎo)致事務(wù)的執(zhí)行失敗,甚至?xí)?dǎo)致數(shù)據(jù)的出錯(cuò)。
在關(guān)系型數(shù)據(jù)庫(kù)中,用戶首先向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送BEGIN,然后執(zhí)行各個(gè)相互一致的寫操作和讀操作,最后用戶可以選擇發(fā)送COMMIT來確認(rèn)之前的修改,或者發(fā)送ROLLBACK進(jìn)行回滾。
在redis中,通過特殊的命令MULTI為開始,之后用戶傳入一連貫的命令,最后EXEC為結(jié)束(在這一過程中可以使用watch進(jìn)行監(jiān)控一些key)。進(jìn)一步分析,redis事務(wù)中的命令會(huì)先推入隊(duì)列,等到EXEC命令出現(xiàn)的時(shí)候才會(huì)將一條條命令執(zhí)行。假若watch監(jiān)控的key發(fā)生改變,這個(gè)事務(wù)將會(huì)失敗。這也就說明Redis事務(wù)中不存在鎖,其他客戶端可以修改正在執(zhí)行事務(wù)中的有關(guān)數(shù)據(jù),這也就為什么在多個(gè)客戶端同時(shí)處理相同的數(shù)據(jù)時(shí)事務(wù)往往會(huì)發(fā)生錯(cuò)誤。
2、簡(jiǎn)單理解redis的單線程IO多路復(fù)用
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26