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 11 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
基于Zookeeper的使用详解
May 02 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
抛弃 PHP 代价太高
Apr 26 PHP
laravel学习教程之存取器
Jul 30 PHP
Linux下 php7安装redis的方法
Nov 01 PHP
java解析json方法总结
May 16 PHP
php中yar框架实例用法讲解
Dec 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的Yii框架中的缓存功能
2016/03/29 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
jQuery插件简单实现方法
2015/07/18 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
原生JS实现留言板
2020/03/26 Javascript
python通过索引遍历列表的方法
2015/05/04 Python
深入解析Python中的线程同步方法
2016/06/14 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
商务日语毕业生自荐信
2013/11/23 职场文书
员工薪酬福利制度
2014/01/17 职场文书
阅兵口号
2014/06/19 职场文书
毕业生找工作求职信
2014/08/05 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
纯html+css实现打字效果
2021/08/02 HTML / CSS
SQL SERVER触发器详解
2022/02/24 SQL Server
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
Python中的 No Module named ***问题及解决
2022/07/23 Python