新聞中心
Redis中的CAS:是什么?

在Redis中,CAS是一種常用的并發(fā)控制機(jī)制。CAS是“Compare and Swap”的縮寫,它是一種樂觀鎖實(shí)現(xiàn)方式,也叫無鎖算法。CAS是指將一個(gè)內(nèi)存位置值與給定值比較,僅當(dāng)兩者相同時(shí),才將該內(nèi)存位置值修改為新值。在Redis中,CAS通過WATCH命令和multi/EXEC命令實(shí)現(xiàn)。
Redis WATCH命令
WATCH命令是用來監(jiān)視一個(gè)或多個(gè)鍵,在監(jiān)視期間,如果任意一個(gè)被監(jiān)視的鍵發(fā)生變化,服務(wù)器將不再繼續(xù)執(zhí)行事務(wù)中的其他命令,并返回一個(gè)錯(cuò)誤響應(yīng),此時(shí)客戶端需要重新開始整個(gè)事務(wù)。WATCH命令的基本語法如下:
WATCH key [key ...]
下面是一個(gè)示例,演示了如何使用WATCH命令,在Redis中監(jiān)視一個(gè)鍵,當(dāng)它被修改時(shí),事務(wù)會(huì)自動(dòng)回滾:
127.0.0.1:6379> SET mykey 10
OK
127.0.0.1:6379> WATCH mykey
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCRBY mykey 2
QUEUED
127.0.0.1:6379> INCRBY mykey 3
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 12
2) (integer) 0
在上面的例子中,我們首先使用SET命令將mykey鍵設(shè)置為10。然后我們使用WATCH命令來監(jiān)視mykey鍵,接著開始一個(gè)事務(wù)(MULTI命令),在事務(wù)中執(zhí)行兩個(gè)命令,分別將mykey的值增加2和增加3。最后使用EXEC命令提交事務(wù)。由于我們?cè)谑聞?wù)執(zhí)行之前監(jiān)視了mykey鍵,因此在事務(wù)執(zhí)行期間,如果有其他客戶端修改了mykey的值,那么當(dāng)前客戶端的事務(wù)就會(huì)自動(dòng)回滾。
Redis MULTI/EXEC命令
MULTI/EXEC命令用于執(zhí)行一組Redis命令,這組Redis命令可以被看成是一個(gè)原子性操作,即要么全部執(zhí)行成功,要么全部失敗。MULTI/EXEC命令的基本語法如下:
MULTI
... 命令隊(duì)列 ...
EXEC
在MULTI和EXEC之間的命令會(huì)被緩存在服務(wù)器中,直到EXEC被調(diào)用。在緩存中的命令如果沒有發(fā)生錯(cuò)誤,服務(wù)器會(huì)按順序執(zhí)行這些命令。如果其中有一個(gè)命令發(fā)生錯(cuò)誤,后面的所有命令都不會(huì)被執(zhí)行。如果所有命令都執(zhí)行成功,服務(wù)器將返回一個(gè)包含每個(gè)命令執(zhí)行結(jié)果的數(shù)組響應(yīng)。下面是一個(gè)示例,演示了如何使用MULTI/EXEC命令,在Redis中執(zhí)行一個(gè)事務(wù):
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCRBY mykey 2
QUEUED
127.0.0.1:6379> INCRBY mykey 3
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 12
2) (integer) 15
在上面的例子中,我們使用MULTI命令來開始一個(gè)事務(wù),該事務(wù)中包含兩個(gè)INCRBY命令,分別將mykey的值增加2和增加3。然后我們使用EXEC命令提交該事務(wù)。由于該事務(wù)中的兩個(gè)命令都執(zhí)行成功,因此服務(wù)器返回了包含結(jié)果的數(shù)組。第一個(gè)結(jié)果是將mykey的值增加2所得到的結(jié)果(12),第二個(gè)結(jié)果是將mykey的值增加3所得到的結(jié)果(15)。
在一個(gè)Redis事務(wù)中,如果我們使用CAS來更新某一個(gè)鍵時(shí),可以通過以下方式實(shí)現(xiàn):
# 開始事務(wù)
WATCH key
val = GET key
# 判斷當(dāng)前val值是否為預(yù)期值
if val == expected_val:
# 更新val值
MULTI
SET key new_val
EXEC
else:
# val值已被修改,事務(wù)失敗
UNWATCH
在事務(wù)中,我們使用WATCH命令來監(jiān)視鍵key,然后獲取該鍵的值,如果該值等于我們的期望值expected_val,就開始一個(gè)新的事務(wù),然后使用MULTI/EXEC命令將鍵key的值更新為new_val。如果鍵key的值在WATCH命令和GET命令之間被其他客戶端修改了,當(dāng)前客戶端的事務(wù)就會(huì)自動(dòng)回滾,此時(shí)我們可以使用UNWATCH命令釋放對(duì)key的監(jiān)視。
總結(jié)
CAS是一種樂觀鎖實(shí)現(xiàn)方式,也叫無鎖算法,在并發(fā)控制中應(yīng)用廣泛。在Redis中,CAS通過WATCH命令和MULTI/EXEC命令實(shí)現(xiàn),即首先使用WATCH命令監(jiān)視一個(gè)或多個(gè)鍵,在事務(wù)中使用CAS更新某一個(gè)鍵時(shí),需要先獲取該鍵的值,并判斷該值是否等于期望值,只有在該值等于期望值時(shí),才將該鍵的值更新為新值,并在事務(wù)提交前使用MULTI/EXEC命令將所有更新操作打包成一個(gè)原子性操作。如果在事務(wù)提交前,被監(jiān)視的鍵被其他客戶端修改了,當(dāng)前客戶端的事務(wù)就會(huì)自動(dòng)回滾。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!
網(wǎng)頁題目:Redis中的CAS是什么(Redis的cas是什么)
分享鏈接:http://www.dlmjj.cn/article/cccggjj.html


咨詢
建站咨詢
