新聞中心
Redis(Remote Dictionary Server)是一種開(kāi)源的、內(nèi)存緩存數(shù)據(jù)庫(kù),它能夠以高效的速度獲取數(shù)據(jù),因此,對(duì)于一些在線服務(wù),它是非常的有用的。但是Redis并不能滿(mǎn)足原子性操作,這也是Redis的一個(gè)缺點(diǎn)。

最常見(jiàn)的情況是,當(dāng)多個(gè)客戶(hù)端同時(shí)向服務(wù)器發(fā)起原子性操作(如計(jì)數(shù)等),服務(wù)器必須阻止一個(gè)請(qǐng)求,直到另一個(gè)請(qǐng)求完成才能繼續(xù)處理。這也就是所謂的事務(wù)。在Redis中,沒(méi)有原子性操作來(lái)支持事務(wù),所以,當(dāng)多個(gè)用戶(hù)端同時(shí)向服務(wù)器發(fā)起請(qǐng)求時(shí),會(huì)出現(xiàn)數(shù)據(jù)不一致的狀況。
Redis可以使用watch命令實(shí)現(xiàn)樂(lè)觀鎖,這個(gè)命令允許客戶(hù)端監(jiān)視一個(gè)鍵,當(dāng)值發(fā)生改變時(shí),客戶(hù)端就會(huì)收到talkback回復(fù),然后才能開(kāi)始一個(gè)事務(wù)來(lái)更新值。但是,這種機(jī)制只是避免客戶(hù)端訪問(wèn)沖突,依然不滿(mǎn)足原子性操作需求。
為了解決這個(gè)問(wèn)題,Redis提供了一個(gè)“l(fā)ua腳本”功能,它可以用來(lái)在Redis中執(zhí)行原子性操作,保證數(shù)據(jù)的完整性。例如,下面的Lua腳本就是一個(gè)簡(jiǎn)單的例子,用來(lái)為一個(gè)key設(shè)置新值:
local value = redis.call('GET', KEYS[1])
redis.call('SET', KEYS[1], ARGV[1])
return value
函數(shù)redis.call用于在Redis中調(diào)用一個(gè)命令,ARGV數(shù)組用于保存?zhèn)鬟f給腳本的參數(shù),而KEYS數(shù)組用來(lái)存放鍵名,上面的例子中,函數(shù) get 返回當(dāng)前 key 的值,再執(zhí)行set命令,并在最后返回值。使用這種機(jī)制,可以確保所有操作都在一個(gè)原子事務(wù)中完成,因此,數(shù)據(jù)得到正確的更新。
Redis是一種高效的內(nèi)存高速存儲(chǔ)技術(shù),它由于沒(méi)有提供原子性操作而備受詬病。但是,Redis也提供了一些辦法來(lái)實(shí)現(xiàn)原子性操作,如 watch 命令和 lua 腳本,這些辦法都能夠讓Redis服務(wù)器來(lái)實(shí)現(xiàn)事務(wù)性操作。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專(zhuān)業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專(zhuān)注成都高端網(wǎng)站建設(shè)定制開(kāi)發(fā)服務(wù),為客戶(hù)提供專(zhuān)業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),營(yíng)銷(xiāo)網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
新聞標(biāo)題:無(wú)法滿(mǎn)足原子性操作的Redis(不支持原子性的redis)
分享網(wǎng)址:http://www.5511xx.com/article/djdeees.html


咨詢(xún)
建站咨詢(xún)
