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 相关文章推荐
PHP的类 功能齐全的发送邮件类
Oct 09 PHP
一个简单计数器的源代码
Oct 09 PHP
在PWS上安装PHP4.0正式版
Oct 09 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP后台实现微信小程序登录
Aug 03 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 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
php自动加载的两种实现方法
2010/06/21 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
竞选班委演讲稿
2014/04/28 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python
HTML基本元素标签介绍
2022/02/28 HTML / CSS
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸