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(视频)Http下载
Dec 12 PHP
php修改时间格式的代码
May 29 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
php检测url是否存在的方法
Apr 14 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 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
B2K与车机的中波PK
2021/03/02 无线电
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
关于document.cookie的使用javascript
2010/10/29 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
js验证上传图片的方法
2015/05/12 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
在Django的视图(View)外使用Session的方法
2015/07/23 Python
python开发之函数定义实例分析
2015/11/12 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
校园报刊亭的创业计划书
2014/01/02 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
期末自我鉴定
2014/01/23 职场文书
公益广告语集锦
2014/03/13 职场文书
网络管理员岗位职责
2014/03/17 职场文书
汇源肾宝广告词
2014/03/20 职场文书
学生评语大全
2014/04/18 职场文书
活动总结模板
2014/05/09 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
捐助感谢信
2015/01/22 职场文书
补充协议书
2015/01/28 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书