php redis setnx分布式锁简单原理解析

吾爱主题 阅读:91 2021-10-27 14:54:00 评论:0

我就废话不多说了,大家还是直接看代码吧~

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?php //高并发分布式锁 header( "Content-type:text/html;charset=utf-8" ); $redis = new Redis(); $redis ->connect( '127.0.0.1' , 6379); echo "Connection to server sucessfully" ; //echo $redis->get("name");exit; $expire = 1; $key = 'test1' ; $lock = false; $is_lock = $redis ->setnx( $key ,time()+ $expire ); if (! $is_lock ){ $lock_time = $redis ->get( $key ); //锁已过期,重置 if ( $lock_time <time()){ $redis ->del( $key ); $lock_time = $redis ->get( $key ); $is_lock = $redis ->setnx( $key ,time()+ $expire ); } }   $is_lock ? true : false; if ( $is_lock ){ writeFile( "正常访问" . "\n" ); } else { writeFile( "系统繁忙" . "\n" ); } function writeFile( $data , $type = 'a' ){ //sleep(1); //usleep(500000);//假设暂停 500毫秒 $filename = date ( "Ymd" ). ".log" ; $handle =@ fopen ( $filename , $type ); flock ( $handle , LOCK_EX); ob_start(); echo "\n" . "[SQL]" . "\n" ; print_r ( $data ); $string = ob_get_contents(); ob_end_clean(); $fettle = @fwrite( $handle , $string ); fclose( $handle ); @ chmod ( $filename ,0777); }

补充知识:php redis set 单机锁

如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创建的锁的情况,所以我们在创建锁的时候需要引入一个随机值:

?
1 2 3 4 5 6 7 8 9 $ok = $redis ->set( $key , $random , array ( 'nx' , 'ex' =>5));   if ( $ok ) {    $cache ->update();      if ( $redis ->get( $key ) == $random ) {      $redis ->del( $key );    } }

以上这篇php redis setnx分布式锁简单原理解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/zhangjian816/p/10849504.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容