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 ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
ini_set的用法介绍
Jan 07 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
PHP使用内置dir类实现目录遍历删除
Mar 31 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
为你总结一些php信息函数
Oct 21 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
php微信开发之关键词回复功能
Jun 13 PHP
PHP7引入的"??"和"?:"的区别讲解
Apr 08 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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
php5 mysql分页实例代码
2008/04/10 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
如何解决vue在ios微信"复制链接"功能问题
2020/03/26 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
使用python实现扫描端口示例
2014/03/29 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
python 实现多线程下载视频的代码
2019/11/15 Python
Python for循环与getitem的关系详解
2020/01/02 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
欢度春节标语
2014/07/01 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
工作表现证明
2015/06/15 职场文书
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
Android中View.post和Handler.post的关系
2022/06/05 Java/Android