1、前言
為什么要構(gòu)建鎖呢?因?yàn)闃?gòu)建合適的鎖可以在高并發(fā)下能夠保持?jǐn)?shù)據(jù)的一致性,即客戶端在執(zhí)行連貫的命令時上鎖的數(shù)據(jù)不會被別的客戶端的更改而發(fā)生錯誤。同時還能夠保證命令執(zhí)行的成功率。
看到這里你不禁要問redis中不是有事務(wù)操作么?事務(wù)操作不能夠?qū)崿F(xiàn)上面的功能么?
的確,redis中的事務(wù)可以watch可以監(jiān)控?cái)?shù)據(jù),從而能夠保證連貫執(zhí)行的時數(shù)據(jù)的一致性,但是我們必須清楚的認(rèn)識到,在多個客戶端同時處理相同的數(shù)據(jù)的時候,很容易導(dǎo)致事務(wù)的執(zhí)行失敗,甚至?xí)?dǎo)致數(shù)據(jù)的出錯。
在關(guān)系型數(shù)據(jù)庫中,用戶首先向數(shù)據(jù)庫服務(wù)器發(fā)送BEGIN,然后執(zhí)行各個相互一致的寫操作和讀操作,最后用戶可以選擇發(fā)送COMMIT來確認(rèn)之前的修改,或者發(fā)送ROLLBACK進(jìn)行回滾。
在redis中,通過特殊的命令MULTI為開始,之后用戶傳入一連貫的命令,最后EXEC為結(jié)束(在這一過程中可以使用watch進(jìn)行監(jiān)控一些key)。進(jìn)一步分析,redis事務(wù)中的命令會先推入隊(duì)列,等到EXEC命令出現(xiàn)的時候才會將一條條命令執(zhí)行。假若watch監(jiān)控的key發(fā)生改變,這個事務(wù)將會失敗。這也就說明Redis事務(wù)中不存在鎖,其他客戶端可以修改正在執(zhí)行事務(wù)中的有關(guān)數(shù)據(jù),這也就為什么在多個客戶端同時處理相同的數(shù)據(jù)時事務(wù)往往會發(fā)生錯誤。