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 minixml详解
Jul 19 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
php判断数组中是否存在指定键(key)的方法
Mar 17 PHP
mysql_escape_string()函数用法分析
Apr 25 PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 PHP
php微信开发自定义菜单
Aug 27 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
thinkphp5框架路由原理与用法详解
Feb 11 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
mysql 字段类型说明
2007/04/27 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
对angular4子路由&辅助路由详解
2018/10/09 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
python操作日期和时间的方法
2014/03/11 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
python 统计代码行数简单实例
2017/05/04 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Windows下python3.6.4安装教程
2018/07/31 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
初级Java程序员面试题
2016/03/03 面试题
买房协议书
2014/04/11 职场文书
企业计划生育责任书
2015/05/09 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
pytorch中的model=model.to(device)使用说明
2021/05/24 Python
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript