4.1.3 WATCH命令介紹
本文關(guān)鍵詞:Redis入門(mén)指南,由筆耕文化傳播整理發(fā)布。
> 其他綜合 > Redis入門(mén)指南 4.1.3 WATCH命令介紹 2013-06-14 09:53:18 我要投稿
本文所屬圖書(shū) > Redis入門(mén)指南
本書(shū)是一本Redis的入門(mén)指導(dǎo)書(shū)籍,以通俗易懂的方式介紹了Redis基礎(chǔ)與實(shí)踐方面的知識(shí),包括歷史與特性、在開(kāi)發(fā)和生產(chǎn)環(huán)境中部署運(yùn)行Redis、數(shù)據(jù)類型與命令、使用Redis實(shí)現(xiàn)隊(duì)列、事務(wù)、復(fù)制、管道、持久化、優(yōu)化Re... 立即去當(dāng)當(dāng)網(wǎng)訂購(gòu)
我們已經(jīng)知道在一個(gè)事務(wù)中只有當(dāng)所有命令都依次執(zhí)行完后才能得到每個(gè)結(jié)果的返回值,可是有些情況下需要先獲得一條命令的返回值,然后再根據(jù)這個(gè)值執(zhí)行下一條命令。例如,介紹INCR命令時(shí)曾經(jīng)說(shuō)過(guò)使用GET和SET命令自己實(shí)現(xiàn)incr函數(shù)會(huì)出現(xiàn)競(jìng)態(tài)條件,偽代碼如下:
def incr($key)
$value = GET $key
if not $value
$value = 0
$value = $value + 1
SET $key, $value
return $value
肯定會(huì)有很多讀者想到可以用事務(wù)來(lái)實(shí)現(xiàn)incr函數(shù)以防止競(jìng)態(tài)條件,可是因?yàn)槭聞?wù)中的每個(gè)命令的執(zhí)行結(jié)果都是最后一起返回的,所以無(wú)法將前一條命令的結(jié)果作為下一條命令的參數(shù),即在執(zhí)行SET命令時(shí)無(wú)法獲得GET命令的返回值,也就無(wú)法做到增1的功能了。
為了解決這個(gè)問(wèn)題,我們需要換一種思路。即在 GET 獲得鍵值后保證該鍵值不被其他客戶端修改,直到函數(shù)執(zhí)行完成后才允許其他客戶端修改該鍵鍵值,這樣也可以防止競(jìng)態(tài)條件。要實(shí)現(xiàn)這一思路需要請(qǐng)出事務(wù)家族的另一位成員:WATCH。WATCH命令可以監(jiān)控一個(gè)或多個(gè)鍵,一旦其中有一個(gè)鍵被修改(或刪除),之后的事務(wù)就不會(huì)執(zhí)行。監(jiān)控一直持續(xù)到EXEC命令(事務(wù)中的命令是在EXEC之后才執(zhí)行的,所以在MULTI命令后可以修改WATCH監(jiān)控的鍵值),如:
redis> SET key 1
OK
redis> WATCH key
OK
redis> SET key 2
OK
redis> MULTI
OK
redis> SET key 3
QUEUED
redis> EXEC
(nil)
redis> GET key
"2"
上例中在執(zhí)行WATCH命令后、事務(wù)執(zhí)行前修改了key的值(即SET key 2),,所以最后事務(wù)中的命令SET key 3沒(méi)有執(zhí)行,EXEC命令返回空結(jié)果。
學(xué)會(huì)了WATCH命令就可以通過(guò)事務(wù)自己實(shí)現(xiàn)incr函數(shù)了,偽代碼如下:
def incr($key)
WATCH $key
$value = GET $key
if not $value
$value = 0
$value = $value + 1
MULTI
SET $key, $value
result = EXEC
return result[0]
因?yàn)镋XEC命令返回值是多行字符串類型,所以代碼中使用result[0]來(lái)獲得其中第一個(gè)結(jié)果。
提示 由于WATCH命令的作用只是當(dāng)被監(jiān)控的鍵值被修改后阻止之后一個(gè)事務(wù)的執(zhí)行,而不能保證其他客戶端不修改這一鍵值,所以我們需要在EXEC執(zhí)行失敗后重新執(zhí)行整個(gè)函數(shù)。
執(zhí)行EXEC命令后會(huì)取消對(duì)所有鍵的監(jiān)控,如果不想執(zhí)行事務(wù)中的命令也可以使用UNWATCH命令來(lái)取消監(jiān)控。比如,我們要實(shí)現(xiàn)hsetxx函數(shù),作用與HSETNX命令類似,只不過(guò)是僅當(dāng)字段存在時(shí)才賦值。為了避免競(jìng)態(tài)條件我們使用事務(wù)來(lái)完成這一功能:
def hsetxx($key, $field, $value)
WATCH $key
$isFieldExists = HEXISTS $key, $field
if $isFieldExists is 1
MULTI
HSET $key, $field, $value
EXEC
else
UNWATCH
return $isFieldExists
在代碼中會(huì)判斷要賦值的字段是否存在,如果字段不存在的話就不執(zhí)行事務(wù)中的命令,但需要使用UNWATCH命令來(lái)保證下一個(gè)事務(wù)的執(zhí)行不會(huì)受到影響。
點(diǎn)擊復(fù)制鏈接 與好友分享!回本站首頁(yè) 您對(duì)本文章有什么意見(jiàn)或著疑問(wèn)嗎?請(qǐng)到論壇討論您的關(guān)注和建議是我們前行的參考和動(dòng)力 上一篇:4.1.2 錯(cuò)誤處理 下一篇:4.2 生存時(shí)間 相關(guān)文章4.1.3 關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的查詢優(yōu)化
1.3.4 命令行工具
4.2.1 命令介紹
4.3.2 SORT命令
2.2.1 mysql命令行
3.1 圖形制作的基本命令與相關(guān)操作
3.1.1 圖形制作的基本命令
1.3.2 命令行參數(shù)
2.4.3 調(diào)用系統(tǒng)命令執(zhí)行
2.2.2 基本命令
圖文推薦
排行熱門(mén)
文章 下載 讀書(shū)
· Win2000下關(guān)閉無(wú)用端口 · 禁止非法用戶登錄綜合設(shè)置 [win9x篇] · 關(guān)上可惡的后門(mén)——消除NetBIOS隱患 · 網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng) · 潛伏在Windows默認(rèn)設(shè)置中的陷井 · 調(diào)制解調(diào)器的不安全 · 構(gòu)建Windows 2000服務(wù)器的安全防護(hù)林 · SQL Server 2000的安全配置 · Windows優(yōu)化大師注冊(cè)機(jī)源碼 · Aspcode動(dòng)畫(huà)教程 · WIN 2000服務(wù)器防止ICMP數(shù)據(jù)包攻擊教程 · 實(shí)現(xiàn)網(wǎng)絡(luò)隱身的簡(jiǎn)單方法 · 手工進(jìn)行克隆帳號(hào) · 用W32DASM破解網(wǎng)頁(yè)合并器的密碼 · 注冊(cè)表操作動(dòng)畫(huà)教程 · 冰河陷阱v1.2 · 黑客攻防技術(shù)寶典:Web實(shí)戰(zhàn)篇(第2版) · 超級(jí)網(wǎng)管員——網(wǎng)絡(luò)安全 · 代碼大全(第二版) · 軟件之道:軟件開(kāi)發(fā)爭(zhēng)議問(wèn)題剖析 · CSS插件工具箱 · CSS入門(mén)經(jīng)典(第3版) · · CMMI+敏捷整合開(kāi)發(fā)
本文關(guān)鍵詞:Redis入門(mén)指南,由筆耕文化傳播整理發(fā)布。
本文編號(hào):232044
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/232044.html