redis中如何保证原子性
原子性:
原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(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中的事务其实是要保证批量操作的原子性
相关推荐
AlexZhao 2020-06-04
gongruitao 2019-12-27
lvxingzhe 2019-11-04
xienue 2019-10-29
wsxsxz 2019-10-21
Jhonse技术 2011-01-07
山水沐光 2019-05-09
Broadview 2010-02-19
朝气蓬勃 2019-06-12
sgafdsg 2011-04-18
hello小工 2017-10-09
VacantYang 2018-04-05
wxysummer 2016-10-24
teamojiao 2015-11-12
NSSpeak信息安全 2017-12-22
daoge00 2019-04-09
编程10000问 2019-03-27
BitTigerio 2018-05-31
编程语言与高级语言虚拟机杂谈仮 2018-05-27
数据分析侠 2018-04-24