redis setnx 过期时间_正确地使用Redis的SETNX实现锁机制 - Go语言中文社区

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


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->ex
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39667652/article/details/111296034
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-20 20:40:19
  • 阅读 ( 1038 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢