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获取数组长度的方法(有实例)
Oct 27 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
php中stream(流)的用法
Mar 25 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
两款万能的php分页类
Nov 12 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
PHP常用函数之获取汉字首字母功能示例
Oct 21 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几个数学计算的内部函数学习整理
2011/08/06 PHP
Web程序工作原理详解
2014/12/25 PHP
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
高效使用Python字典的清单
2018/04/04 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Python递归实现打印多重列表代码
2020/02/27 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python 代码调试技巧示例代码
2020/08/11 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
装修致歉信
2014/01/15 职场文书
大学班长的职责
2014/01/27 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
中国梦口号
2014/06/13 职场文书
建筑工地文明标语
2014/10/09 职场文书
社区服务活动报告
2015/02/05 职场文书
教师读书笔记
2015/06/29 职场文书
保护地球的宣传语
2015/07/13 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL