原子性:

原子性是资料库的事务中的特性。在资料库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。

对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。

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中的事务其实是要保证批量操作的原子性。


推荐阅读:
相关文章