原子性是資料庫的事務中的特性。在資料庫事務的情景下,原子性指的是:乙個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。
對於redis而言,命令的原子性指的是:乙個操作的不可以再分,操作要麼執行,要麼不執行。
redis的操作之所以是原子性的,是因為redis是單執行緒的。
由於對作業系統相關的知識不是很熟悉,從上面這句話並不能真正理解redis操作是原子性的原因,進一步查閱程序與執行緒的概念及其區別。
redis的api是原子性的操作,那麼多個命令在併發中也是原子性的嗎?
看看下面這段**:
$redis= newredis();
$redis->connect('127.0.0.1',6379);
for($i= 0;$iget('val');
$num++;
$redis->set('val',$num);
usleep(10000);
}
用兩個終端執行上面的程式,發現val的結果是小於2000的值,那麼可以知道,在程式中執行多個redis命令並非是原子性的,這也和普通資料庫的表現是一樣的。
如果想在上面的程式中實現原子性,可以將get和set改成單命令操作,比如incr,或者使用redis的事務,或者使用redis+lua的方式實現。
綜上所述,對redis來說,執行get、set以及eval等api,都是乙個乙個的任務,這些任務都會由redis的執行緒去負責執行,任務要麼執行成功,要麼執行失敗,這就是redis的命令是原子性的原因。
redis本身提供的所有api都是原子操作,redis中的事務其實是要保證批量操作的原子性。
> multi
ok> incr foo
queued
> incr bar
queued
> exec
1) (integer) 1
2) (integer) 1
知其然知其所以然
深深的話我們淺淺地說,長長的路我們慢慢地走。讓我們始終有勇氣特立獨行。不溫不火,不疾不徐。將記憶自拔於困頓的泥沼,將希望播撒於每一寸光陰!生活縱有千千結,還是要繼續下去,時光就是如此的公平。最近總是陷入乙個又乙個的糾結,乙個又乙個的心塞。生活彷彿陷入了恍若隔世的噩夢中,而自己就是噩夢中的小丑一樣,只...
java結果輸出,知其所以然
輸出結果是什麼?為什麼會出現這種結果?一public class parenttest static public class childrentest extends parenttest static public static void main string args 二 true or f...
知其所以然 劉未鵬
這是乙個樹狀的知識結構,越往上層走,需要記憶的節點就越少。所謂觸類旁通者,其實便是因為他擅長去理解解法背後的更具一般性的東西。所以我還有乙個習慣,就是看到美妙的證明和解法總是會去一遍又一遍的去反覆揣摩,試圖理解想出這個證明的人到底是怎麼想出來的,有沒有什麼一般性的方法可循,很多時候,在這樣揣摩的過程...