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中的正规表达式(二)
Oct 09 PHP
php错误、异常处理机制(补充)
May 07 PHP
PHP 图片水印类代码
Aug 27 PHP
php 模拟post_验证页面的返回状态(实例讲解)
Oct 28 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
php利用ob_start()清除输出和选择性输出的方法
Jan 18 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
php工具型代码之印章抠图
Jul 18 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 PHP
php 使用 __call实现重载功能示例
Nov 18 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
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
React组件refs的使用详解
2018/02/09 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
实践Vim配置python开发环境
2018/07/02 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
法学专业大学生实习自我鉴定
2014/10/05 职场文书
学校证明范文
2015/06/24 职场文书
重阳节活动主持词
2015/07/04 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
Docker安装MySql8并远程访问的实现
2022/07/07 Servers