当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-29 08:22:27 浏览: 评论:0 

这篇文章主要介绍了php redis setnx分布式锁简单原理解析,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

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

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

补充知识:php redis set 单机锁

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

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

Tags: redis setnx

分享到: