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