原子性:
原子性是數(shù)據(jù)庫的事務中的特性。在數(shù)據(jù)庫事務的情景下,原子性指的是:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。
對于Redis而言,命令的原子性指的是:一個操作的不可以再分,操作要么執(zhí)行,要么不執(zhí)行。
Redis操作原子性的原因:
Redis的操作之所以是原子性的,是因為Redis是單線程的。
Redis在并發(fā)中的表現(xiàn):
Redis的API是原子性的操作,那么多個命令在并發(fā)中也是原子性的嗎?
有以下代碼:
$redis=?newRedis(); $redis->connect('127.0.0.1',6379); for($i=?0;$iget('val'); $num++; $redis->set('val',$num); usleep(10000); }
用兩個終端執(zhí)行上面的程序,發(fā)現(xiàn)val的結(jié)果是小于2000的值,那么可以知道,在程序中執(zhí)行多個Redis命令并非是原子性的,這也和普通數(shù)據(jù)庫的表現(xiàn)是一樣的。
如果想在上面的程序中實現(xiàn)原子性,可以將get和set改成單命令操作,比如incr,或者使用Redis的事務,或者使用Redis+Lua的方式實現(xiàn)。
對Redis來說,執(zhí)行g(shù)et、set以及eval等API,都是一個一個的任務,這些任務都會由Redis的線程去負責執(zhí)行,任務要么執(zhí)行成功,要么執(zhí)行失敗,這就是Redis的命令是原子性的原因。
Redis本身提供的所有API都是原子操作,Redis中的事務其實是要保證批量操作的原子性
更多Redis相關知識,請訪問Redis使用教程欄目!