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 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
NO3第三帝国留言簿制作过程
Oct 09 PHP
php中取得URL的根域名的代码
Mar 23 PHP
php HandlerSocket的使用
May 02 PHP
php的memcached客户端memcached
Jun 14 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
php中序列化与反序列化详解
Feb 13 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
Python实现统计单词出现的个数
2015/05/28 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
Python json格式化打印实现过程解析
2020/07/21 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
关于人生的感言
2014/01/17 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
大学生就业自荐书
2014/06/16 职场文书
社区义诊通知
2015/04/24 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript