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 相关文章推荐
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php Smarty 字符比较代码
Feb 27 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
PHP中的print_r 与 var_dump 输出数组
Jun 13 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
thinkphp 验证码 的使用小结
May 07 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
原生js获取left值和top值的三种方法
2017/08/02 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Django+Vue跨域环境配置详解
2018/07/06 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
JS中数据结构之栈
2019/01/01 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
Python实现的栈(Stack)
2018/01/26 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
幼儿教师寄语集锦
2014/04/03 职场文书
授权委托书
2014/07/31 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
大班下学期个人总结
2015/02/13 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技