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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
php使用include 和require引入文件的区别
Feb 16 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
thinkphp5框架路由原理与用法详解
Feb 11 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 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中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP URL路由类实例
2013/11/12 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHP云打印类完整示例
2016/10/15 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
python表格存取的方法
2018/03/07 Python
Python List cmp()知识点总结
2019/02/18 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
python如何快速生成时间戳
2020/07/21 Python
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
银行办公室岗位职责
2014/03/10 职场文书
农林环境专业求职信
2014/03/13 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
实习单位推荐信
2015/03/27 职场文书
2016年党员承诺书范文
2016/03/24 职场文书