這期內(nèi)容當中小編將會給大家?guī)碛嘘P如何在Redis數(shù)據(jù)庫實現(xiàn)API原子性,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)服務項目包括臺山網(wǎng)站建設、臺山網(wǎng)站制作、臺山網(wǎng)頁制作以及臺山網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,臺山網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到臺山省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!原子性
原子性是數(shù)據(jù)庫的事務中的特性。在數(shù)據(jù)庫事務的情景下,原子性指的是:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環(huán)節(jié)?!揪S基百科】
對于Redis而言,命令的原子性指的是:一個操作的不可以再分,操作要么執(zhí)行,要么不執(zhí)行。
Redis操作原子性的原因
Redis的操作之所以是原子性的,是因為Redis是單線程的。
由于對操作系統(tǒng)相關的知識不是很熟悉,從上面這句話并不能真正理解Redis操作是原子性的原因,進一步查閱進程與線程的概念及其區(qū)別。
進程與線程
進程
計算機中已執(zhí)行程序的實體。【維基百科】。比如,一個啟動了的php-fpm,就是一個進程。
線程
操作系統(tǒng)能夠進行運算調度的最小單元。它被包含在進程之中,是進程的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務?!揪S基百科】。比如,mysql運行時,mysql啟動后,該mysql服務就是一個進程,而mysql的連接、查詢的操作,就是線程。
進程與線程的區(qū)別
資源(如打開文件):進程間的資源相互獨立,同一進程的各線程間共享資源。某進程的線程在其他進程不可見。
通信:進程間通信:消息傳遞、同步、共享內(nèi)存、遠程過程調用、管道。線程間通信:直接讀寫進程數(shù)據(jù)段(需要進程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性)。
調度和切換:線程上下文切換比進程上下文切換要快得多。
線程,是操作系統(tǒng)最小的執(zhí)行單元,在單線程程序中,任務一個一個地做,必須做完一個任務后,才會去做另一個任務。
Redis在并發(fā)中的表現(xiàn)
Redis的API是原子性的操作,那么多個命令在并發(fā)中也是原子性的嗎?
看看下面這段代碼:
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); for($i = 0; $i < 1000; $i++) { $num = (int) $redis->get('val'); $num++; $redis->set('val', $num); usleep(10000); }
用兩個終端執(zhí)行上面的程序,發(fā)現(xiàn)val的結果是小于2000的值,那么可以知道,在程序中執(zhí)行多個Redis命令并非是原子性的,這也和普通數(shù)據(jù)庫的表現(xiàn)是一樣的。
如果想在上面的程序中實現(xiàn)原子性,可以將get和set改成單命令操作,比如incr,或者使用Redis的事務,或者使用Redis+Lua的方式實現(xiàn)。
總結
綜上所述,對Redis來說,執(zhí)行get、set以及eval等API,都是一個一個的任務,這些任務都會由Redis的線程去負責執(zhí)行,任務要么執(zhí)行成功,要么執(zhí)行失敗,這就是Redis的命令是原子性的原因。
Redis本身提供的所有API都是原子操作,Redis中的事務其實是要保證批量操作的原子性。
上述就是小編為大家分享的如何在Redis數(shù)據(jù)庫實現(xiàn)API原子性了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。