Red i s的SETNX的使法
对应给定的keys到他们相应的values上。只要有个key已经存在,
MSETNX个操作都会执。由于这种特性,MSETNX可以实现要么所
有的操作都成功,要么个都执,这样可以来设置同的key,来
表示个唯的对象的同字段。
在 Redis ,所谓 SETNX,是「SET if Not eXists」的缩写,也就是只有
存在的时候才设置,可以它来实现锁的效果,过很多没有意识
到 SETNX 有陷阱!
如说:某个查询数据库的接,因为调较,所以加缓存,并
设定缓存过期后刷新,问题是当并发较的时候,如果没有锁机制,
那么缓存过期的瞬间,并发请求会穿透缓存直接查询数据库,造成雪
崩效应,如果有锁机制,那么就可以控制只有个请求去新缓存,其它
的请求视情况要么等待,要么使过期的缓存。
下以前 PHP 社区最流的 PHPRedis 扩展为,实现段演示代
码:
<?php
$ok = $redis->setNX($key, $value);
if ($ok) {
$cache->update();
$redis->del($key);
}
?>
缓存过期时,通过 SetNX 获取锁,如果成功,那么新缓存,然后删
除锁。看上去逻辑常简单,可惜有问题:如果请求执因为某些原因意
外退出,导致创建锁但是没有删除锁,那么这个锁将直存在,以
于以后缓存再也得到新。于是乎我们需要给锁加个过期时间以防
测:
评论0
最新资源