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 07 PHP
php二维数组用键名分组相加实例函数
Nov 06 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
php常用的工具开发整理
Sep 26 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
php验证码生成器
2017/05/24 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
2007/03/27 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
canvas时钟效果
2017/02/16 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
python把1变成01的步骤总结
2019/02/27 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
python音频处理的示例详解
2020/12/23 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
小学亲子活动总结
2014/07/01 职场文书
毕业证委托书范文
2014/09/26 职场文书
门卫岗位职责
2015/02/09 职场文书
初中物理教学反思
2016/02/19 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android
Python字符串的转义字符
2022/04/07 Python