PHP使用Redis实现防止大并发下二次写入的方法


Posted in PHP onOctober 09, 2017

本文实例讲述了PHP使用Redis实现防止大并发下二次写入的方法。分享给大家供大家参考,具体如下:

PHP调用redis进行读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。

$lock_key = 'LOCK_PREFIX' . $redis_key;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
  $redis->setex($redis_key, $expire, $data); // 写入内容
  // 释放锁
  $redis->del($lock_key);
}else{
  return true; // 获取不到锁权限,直接返回
}

思路是:设置一个锁的key,setnx是原子操作,只能一个进程写入成功,写入成功返回true(表示获取锁权限),然后写入内容再释放锁即删除锁key。获取不到锁的进程直接返回。但是这里有种情况,获取锁权限的进程,获取锁后运行报错了,导致没有释放锁,那么一直就不能写入内容,这时就需要拿不到锁权限的进程去判断锁的剩余有效时间,如果为-1则设置锁的有效时间为5秒(预留5秒给拿到锁的进程的运行时间,足够多了)。改良后的代码:

$lock_key = 'LOCK_PREFIX' . $redis_key;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
  $redis->setex($redis_key, $expire, $data); // 写入内容
  // 释放锁
  $redis->del($lock_key);
}else{
  // 防止死锁
  if($redis->ttl($lock_key) == -1){
    $redis->expire($lock_key, 5);
  }
  return true; // 获取不到锁权限,直接返回
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
人大复印资料处理程序_输入篇
Oct 09 PHP
PHP+DBM的同学录程序(3)
Oct 09 PHP
php中++i 与 i++ 的区别
Aug 08 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
简述php环境搭建与配置
Dec 05 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 #PHP
PHP完全二叉树定义与实现方法示例
Oct 09 #PHP
PHP实现的折半查询算法示例
Oct 09 #PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 #PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 #PHP
PHP实现打包下载文件的方法示例
Oct 07 #PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 #PHP
You might like
德生1994机评
2021/03/02 无线电
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
基于Python的接口测试框架实例
2016/11/04 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
简单实现python聊天程序
2018/04/01 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
python logging模块的使用总结
2019/07/09 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
技校毕业生个人学习的自我评价
2014/02/21 职场文书
大型会议接待方案
2014/03/01 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
教师先进事迹材料
2014/12/16 职场文书
2014会计年终工作总结
2014/12/20 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
React中的Context应用场景分析
2021/06/11 Javascript
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python