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 相关文章推荐
用Flash图形化数据(二)
Oct 09 PHP
《PHP边学边教》(01.开篇――准备工作)
Dec 13 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
PHP+ajax 无刷新删除数据
Feb 20 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
php根据生日计算年龄的方法
Jul 13 PHP
Yii开启片段缓存的方法
Mar 28 PHP
php网页版聊天软件实现代码
Aug 12 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
php压缩文件夹最新版
Jul 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
收集的php编写大型网站问题集
2007/03/06 PHP
php教程之phpize使用方法
2014/02/12 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
js下用gb2312编码解码实现方法
2009/12/31 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
Python字符串拼接六种方法介绍
2017/12/18 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
python3多线程知识点总结
2019/09/26 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
举例说明类变量和实例变量的区别
2016/06/30 面试题
医学检验专业大学生求职信
2013/11/18 职场文书
学校招生宣传广告词
2014/03/19 职场文书
校友回访母校寄语
2015/02/26 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
全网非常详细的pytest配置文件
2022/07/15 Python