当前位置:首页 > 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. } 
  21.  
  22. $is_lock ? true : false; 
  23. if($is_lock){ 
  24. writeFile("正常访问"."\n"); 
  25. }else{ 
  26. writeFile("系统繁忙"."\n"); 
  27. } 
  28. function writeFile($data,$type='a'){ 
  29. //sleep(1); 
  30. //usleep(500000);//假设暂停 500毫秒 
  31. $filename = date("Ymd").".log"; 
  32. $handle =@ fopen($filename, $type); 
  33. flock($handle, LOCK_EX); 
  34. ob_start(); 
  35. echo "\n" . "[SQL]" . "\n"; 
  36. print_r ($data); 
  37. $string = ob_get_contents(); 
  38. ob_end_clean(); 
  39. $fettle = @fwrite($handle, $string); 
  40. fclose($handle); 
  41. @chmod($filename,0777); 
  42. } 

补充知识:php redis set 单机锁

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

  1. $ok = $redis->set($key, $random, array('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

分享到: