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验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
php继承的一个应用
Sep 06 PHP
PHP采用XML-RPC构造Web Service实例教程
Jul 16 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
PHP chr()函数讲解
Feb 11 PHP
Laravel框架中集成MongoDB和使用详解
Oct 17 PHP
laravel框架中视图的基本使用方法分析
Nov 23 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
xmlHTTP实例
2006/10/24 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
浅谈python迭代器
2017/11/08 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
详解python的ORM中Pony用法
2018/02/09 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
几道PHP面试题
2013/04/14 面试题
如何在C# winform中异步调用web services
2015/09/21 面试题
化工机械应届生求职信
2013/11/04 职场文书
质检部岗位职责
2013/11/11 职场文书
大学专科求职信
2014/07/02 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
以权谋私检举信范文
2015/03/02 职场文书
给朋友的道歉短信
2015/05/12 职场文书