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 相关文章推荐
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
yii,CI,yaf框架+smarty模板使用方法
Dec 29 PHP
Yii中表单用法实例详解
Jan 05 PHP
Joomla开启SEF的方法
May 04 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 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+mysql扎实个人基本功
2008/03/27 PHP
PHP中的string类型使用说明
2010/07/27 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
laravel自定义分页效果
2017/07/23 PHP
php集成开发环境详解
2019/09/24 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
js模拟百度模糊搜索的实例
2017/08/04 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
python中模块的__all__属性详解
2017/10/26 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
python、Matlab求定积分的实现
2019/11/20 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
pygame实现弹球游戏
2020/04/14 Python
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
《晚上的太阳》教学反思
2014/04/23 职场文书
公务员诚信承诺书
2014/05/26 职场文书
初婚未育证明样本
2014/10/24 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
python实现过滤敏感词
2021/05/08 Python
Python类方法总结讲解
2021/07/26 Python