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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
php随机输出名人名言的代码
Oct 07 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
php在数组中查找指定值的方法
Mar 17 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
php获取ip及网址的简单方法(必看)
Apr 01 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
laravel 使用auth编写登录的方法
Sep 30 PHP
Laravel配合jwt使用的方法实例
Oct 25 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函数之子字符串替换 str_replace
2011/03/23 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
JS验证码实现代码
2017/09/14 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
Angular异步变同步处理方法
2018/08/13 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python GUI图形化编程wxpython的使用
2019/07/19 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
pycharm永久激活超详细教程
2020/10/29 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
美国在线家装零售商:Build.com
2016/09/02 全球购物
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
2014年“世界无车日”活动方案
2014/09/21 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
商业计划书范文
2019/04/24 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP