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中的时间显示
Jan 18 PHP
PHP学习 运算符与运算符优先级
Jun 15 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
微信自定义菜单的创建/查询/取消php示例代码
Aug 05 PHP
PHP编写daemon process详解及实例代码
Sep 30 PHP
php批量修改表结构实例
May 24 PHP
yii插入数据库防并发的简单代码
May 27 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
浅谈laravel中的关联查询with的问题
Oct 10 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 开源框架22个简单简介
2009/08/24 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
PHP打印输出函数汇总
2016/08/28 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
js类型检查实现代码
2010/10/29 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Python subprocess模块详细解读
2018/01/29 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
找工作最新求职信
2013/12/22 职场文书
渡河少年教学反思
2014/02/12 职场文书
投资意向书
2014/07/30 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
假释思想汇报范文
2014/10/11 职场文书
公司感谢信范文
2015/01/22 职场文书
超市采购员岗位职责
2015/04/07 职场文书
公司联欢会主持词
2015/07/04 职场文书
2015年暑期见闻
2015/07/14 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
Oracle中update和select 关联操作
2022/01/18 Oracle