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


Posted in PHP onOctober 23, 2020

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

<?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 单机锁

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

$ok = $redis->set($key, $random, array('nx', 'ex' =>5));

if ($ok) {
  $cache->update();

  if ($redis->get($key) == $random) {
    $redis->del($key);
  }
}

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

PHP 相关文章推荐
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
PHP中用hash实现的数组
Jul 17 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
Apr 21 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
php实现转换ubb代码的方法
Jun 18 PHP
PHP中的流(streams)浅析
Jul 02 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 #PHP
php使用event扩展的io复用测试的示例
Oct 20 #PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 #PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 #PHP
php实现记事本案例
Oct 20 #PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 #PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 #PHP
You might like
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
php格式化时间戳
2016/12/17 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP count()函数讲解
2019/02/03 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
vue实现评价星星功能
2020/06/30 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
分析python服务器拒绝服务攻击代码
2014/01/16 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
为什么要有struct关键字
2012/05/08 面试题
卫生巾广告词
2014/03/18 职场文书
班风学风建设方案
2014/05/06 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
2015年党员自评材料
2014/12/17 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android