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 无限级数据JSON格式及JS解析
Jul 17 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
PHP输入输出流学习笔记
May 12 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
使用PHP进行微信公众平台开发的示例
Aug 21 PHP
php精确的统计在线人数的方法
Oct 21 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
php实现微信扫码支付
Mar 26 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 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 裁剪图片成固定大小代码方法
2009/09/09 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP写日志的实现方法
2014/11/05 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
用js实现in_array的方法
2013/11/05 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
python实现飞船大战
2020/04/24 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
大专毕业生自我评价分享
2013/11/10 职场文书
六十岁生日答谢词
2014/01/10 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
小学思品教学反思
2016/02/20 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
python基础之爬虫入门
2021/05/10 Python
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server