nx set 怎么实现的原子性_redis并发问题(setnx事例)

Redis作为单线程数据库,在并发场景下可能存在数据一致性问题。文章通过实例解释了并发更新键值时可能出现的问题,并探讨了Redis的事务特性,指出其事务不保证原子性。解决方案包括使用`INCR`或`INCRBY`命令以及`WATCH`配合`MULTI/EXEC`事务。此外,介绍了基于`SETNX`实现的分布式锁来保证原子性操作。
摘要由CSDN通过智能技术生成

redis中的并发问题

使用redis作为缓存已经很久了,redis是以单线程的形式运行的,命令是一个接着一个执行的,一直以为不会存在并发的问题,直到今天看到相关的资料,才恍然大悟~~

具体问题实例

有个键,假设名称为myNum,里面保存的是阿拉伯数字,假设现在值为1,存在多个连接对myNum进行操作的情况,这个时候就会有并发的问题。假设有两个连接linkA和linkB,这两个连接都执行下面的操作,取出myNum的值,+1,然后再存回去,看看下面的交互:

linkA get myNum => 1

linkB get myNum => 1

linkA set muNum => 2

linkB set myNum => 2

执行完操作之后,结果可能是2,这和我们预期的3不一致。

再看一个具体的例子:

require "vendor/autoload.php";

$client = new Predis\Client([

'scheme' => 'tcp',

'host' => '127.0.0.1',

'port' => 6379,

]);

for ($i = 0; $i < 1000; $i++) {

$num = intval($client->get("name"));

$num = $num + 1;

$client->setex("name", $num, 10080);

usleep(10000);

}

设置name初始值为0,然后同时用两个终端执行上面的程序,最后name的值可能不是2000,而是一个小于<2000的值,这也就证明了我们上面的并发问题的存在,这个该怎么解决呢?

redis中的事务

redis中也是有事务的,不过这个事务没有mysql中的完善,只保证了一致性和隔离性,不满足原子性和持久性。

redis事务使用multi、exec命令

原子性,redis会将事务中的所有命令执行一遍,哪怕是中间有执行失败也不会回滚。kill信号、宿主机宕机等导致事务执行失败,redis也不会进行重试或者回滚。

持久性,redis事务的持久性依赖于redis

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值