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 06 PHP
Discuz 模板引擎的封装类代码
Jul 18 PHP
PHP 危险函数全解析
Sep 09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
PHP和Mysql中转UTF8编码问题汇总
Oct 10 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
Yii框架函数简单用法分析
Sep 09 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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
php中文验证码实现示例分享
2014/01/12 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
python 绘制国旗的示例
2020/09/27 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
shell的种类有哪些
2015/04/15 面试题
七年级英语教学反思
2014/01/15 职场文书
北体毕业生求职信
2014/02/28 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
GO中sync包自由控制并发示例详解
2022/08/05 Golang