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写的MySQL数据库用户认证系统代码
Mar 22 PHP
php批量缩放图片的代码[ini参数控制]
Feb 11 PHP
php正则表达式(regar expression)
Sep 10 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
memcache命令启动参数中文解释
Jan 13 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
php操作mongoDB实例分析
Dec 29 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
Laravel第三方包报class not found的解决方法
Oct 13 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开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
教师求职自荐信
2015/03/26 职场文书
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL