我就废话不多说了,大家还是直接看代码吧~
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