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

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


咨詢
建站咨詢
