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 相关文章推荐
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
php自动给文章加关键词链接的函数代码
Nov 29 PHP
php分页代码学习示例分享
Feb 20 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
PHP计算加权平均数的方法
Jul 16 PHP
PHP引用返回用法示例
May 28 PHP
php登录超时检测功能实例详解
Mar 21 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
php服务器的系统详解
Oct 12 PHP
PHP rsa加密解密算法原理解析
Dec 09 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
zend framework文件上传功能实例代码
2013/12/25 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
浅谈php提交form表单
2015/07/01 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
Python的多维空数组赋值方法
2018/04/13 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
Python和Bash结合在一起的方法
2020/11/13 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
CSS3 display知识详解
2015/11/25 HTML / CSS
波兰珠宝品牌:YES
2019/08/09 全球购物
打架检讨书800字
2014/01/10 职场文书
运动会广播稿150字
2014/02/19 职场文书
卖车协议书
2014/04/21 职场文书
科技活动周标语
2014/10/08 职场文书
2015秋学期开学寄语
2015/05/28 职场文书