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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
php获得当前的脚本网址
Dec 10 PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
php缓冲输出实例分析
Jan 05 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
stripos函数知识点实例分享
Feb 11 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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 根据key 给二维数组分组
2016/12/09 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Python collections模块实例讲解
2014/04/07 Python
Python中join函数简单代码示例
2018/01/09 Python
python write无法写入文件的解决方法
2019/01/23 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
介绍一下gcc特性
2015/10/31 面试题
企业给企业的表扬信
2014/01/13 职场文书
便利店的创业计划书
2014/01/15 职场文书
三年级科学教学反思
2014/01/29 职场文书
幼教求职信
2014/03/12 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
十岁生日答谢词
2015/01/05 职场文书
小学元宵节活动总结
2015/02/06 职场文书
地球上的星星观后感
2015/06/02 职场文书
JS 基本概念详细介绍
2021/10/16 Javascript
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
sql注入报错之注入原理实例解析
2022/06/10 MySQL
Hive日期格式转换方法总结
2022/06/25 数据库