知其所以然 redis的原子性

2022-02-18 15:50:46 字數 1024 閱讀 5773

原子性是資料庫的事務中的特性。在資料庫事務的情景下,原子性指的是:乙個事務(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...

知其所以然 劉未鵬

這是乙個樹狀的知識結構,越往上層走,需要記憶的節點就越少。所謂觸類旁通者,其實便是因為他擅長去理解解法背後的更具一般性的東西。所以我還有乙個習慣,就是看到美妙的證明和解法總是會去一遍又一遍的去反覆揣摩,試圖理解想出這個證明的人到底是怎麼想出來的,有沒有什麼一般性的方法可循,很多時候,在這樣揣摩的過程...