原子性:
原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(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中的事务其实是要保证批量 *** 作的原子性
更多Redis相关知识,请访问Redis使用教程栏目!
以上就是redis中如何保证原子性的详细内容,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)