redis setnx 过期时间_正确地使用Redis的SETNX实现锁机制

Redis的SETNX命令常用于实现锁机制,但存在潜在问题。当并发请求在缓存过期时尝试更新,可能导致数据库雪崩。单纯使用setNX加锁并设置过期时间,可能因命令不具原子性而引发问题。通过Multi/Exec确保原子性及使用SET命令的过期时间功能可改善,但仍需注意锁超时与删除时的判断,以防止误删其他请求的锁。解决方案包括在创建锁时附加随机值,在删除时进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2193d057a74b9bcd2c170010381775e6.png

setNX,是set if not exists 的缩写,也就是只有不存在的时候才设置, 设置成功时返回 1 , 设置失败时返回 0 。可以利用它来实现锁的效果,但是很多人在使用的过程中都有一些问题没有考虑到。

例如某个查询数据库的接口因为请求量比较大所以加了缓存,并设定缓存过期后刷新。当并发量比较大并且缓存过期的瞬间,大量并发请求会直接查询数据库导致雪崩。如果使用锁机制来控制只有一个请求去更新缓存就能避免雪崩的问题。

下面是很多人下意识想到的加锁方法

$rs = $redis->setNX($key, $value);if ($rs) {
    
        //处理更新缓存逻辑    // ......    //删除锁    $redis->del($key);}

通过 setNX 获取锁,如果成功了则更新缓存然后删除锁。其实这里有一个严重的问题:如果更新缓存的时候因为某些原因意外退出了,那么这个锁就不会被删除而一直存在,以至于缓存再也得不到更新。

为了解决这个问题有人可能会想到给锁设置一个过期时间,如下

$redis->multi();$redis->setNX($key, $value);$redis->expire($key, $ttl);$redis->exec();

因为 setNX 不具备设置过期时间的功能,所以要借助 Expire 来设置,同时需要使用 Multi/Ex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值