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 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
解析php中获取系统信息的方法
Jun 25 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
PHP安全上传图片的方法
Mar 21 PHP
smarty模板引擎之内建函数用法
Mar 30 PHP
CodeIgniter生成静态页的方法
May 17 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
PHP的PDO大对象(LOBs)
Jan 27 PHP
PHP7匿名类的用法示例
Apr 05 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 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代码
2010/07/17 PHP
php下获取http状态的实现代码
2014/05/09 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
Javascript 实用小技巧
2010/04/07 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
django之常用命令详解
2016/06/30 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
python用700行代码实现http客户端
2021/01/14 Python
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
2013届毕业生求职信范文
2013/11/20 职场文书
公司新员工的演讲稿注意事项
2014/01/01 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
团结主题班会
2015/08/13 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers
MySQL数据库 安全管理
2022/05/06 MySQL
PHP 时间处理类Carbon
2022/05/20 PHP