在學習redis的常用操作時,經常看到介紹說,redis的set、get以及hset等等命令的執行都是原子性的,但是令自己百思不得其解的是,為什麼這些操作是原子性的?
原子性是資料庫的事務中的特性。在資料庫事務的情景下,原子性指的是:乙個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。【維基百科】
對於redis而言,命令的原子性指的是:乙個操作的不可以再分,操作要麼執行,要麼不執行。
redis的操作之所以是原子性的,是因為redis是單執行緒的。
由於對作業系統相關的知識不是很熟悉,從上面這句話並不能真正理解redis操作是原子性的原因,進一步查閱程序與執行緒的概念及其區別。
計算機中已執行程式的實體。【維基百科】。比如,乙個啟動了的php-fpm,就是乙個程序。
作業系統能夠進行運算排程的最小單元。它被包含在程序之中,是程序的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。【維基百科】。比如,mysql執行時,mysql啟動後,該mysql服務就是乙個程序,而mysql的連線、查詢的操作,就是執行緒。
執行緒,是作業系統最小的執行單元,在單執行緒程式中,任務乙個乙個地做,必須做完乙個任務後,才會去做另乙個任務。redis的api是原子性的操作,那麼多個命令在併發中也是原子性的嗎?
看看下面這段**:
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
for($i = 0; $i < 1000; $i++)
用兩個終端執行上面的程式,發現val的結果是小於2000的值,那麼可以知道,在程式中執行多個redis命令並非是原子性的,這也和普通資料庫的表現是一樣的。
如果想在上面的程式中實現原子性,可以將get和set改成單命令操作,比如incr,或者使用redis的事務,或者使用redis+lua的方式實現。
綜上所述,對redis來說,執行get、set以及eval等api,都是乙個乙個的任務,這些任務都會由redis的執行緒去負責執行,任務要麼執行成功,要麼執行失敗,這就是redis的命令是原子性的原因。
redis本身提供的所有api都是原子操作,redis中的事務其實是要保證批量操作的原子性。
原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。
UIApplication深入學習
新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...
深入學習CSS
什麼是css?在之前的這篇文章中已經介紹了初步的介紹,詳細請看 div加css進一步講解了css中的內容,先總結如下圖 其實在實際開發中,我們通常採用是外部樣式的匯入,這樣做的好處是對於很對有同樣設計樣式的頁面可以實現樣式的共享,這樣我們不僅僅可以節省了大量的時間,並且也方便我們可以靈活的呼叫的樣式...
block深入學習
block的宣告和使用看上一節就行了。本章主要講block內部的實現過程及原理。block的定義和函式指標非常相似 對比一下 block定義 void someblock 函式指標定義 void functionpionter void functionname 當然區別還是有的,block的返回型...