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 相关文章推荐
PHP5.2下chunk_split()函数整数溢出漏洞 分析
Jun 06 PHP
真正的ZIP文件操作类(php)
Jul 21 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
7个超级实用的PHP代码片段
Jul 11 PHP
PHP常用正则表达式集锦
Aug 17 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
PHP中类的继承和用法实例分析
May 24 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
浅谈thinkphp5 instance 的简单实现
Jul 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语法(5)
2006/10/09 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
python的exec、eval使用分析
2017/12/11 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
python 读取、写入txt文件的示例
2020/09/27 Python
python 制作本地应用搜索工具
2021/02/27 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
.net工程师笔试题
2012/06/09 面试题
黑暗中的舞者观后感
2015/06/18 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
Python Django模型详解
2021/10/05 Python