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
Windows下的PHP5.0详解
Nov 18 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
基于PHP异步执行的常用方式详解
Jun 03 PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
php生成随机颜色的方法
Nov 13 PHP
PHP数组相关函数汇总
Mar 24 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
Centos7安装swoole扩展操作示例
Mar 26 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
JS交换变量的方法
2015/01/21 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Python如何执行系统命令
2020/09/23 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
python中最小二乘法详细讲解
2021/02/19 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
安全生产活动月方案
2014/03/09 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
公司辞职信模板
2015/05/13 职场文书
小英雄雨来观后感
2015/06/09 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
使用Django实现商城验证码模块的方法
2021/06/01 Python
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS