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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
PHP中mysql_field_type()函数用法
Nov 24 PHP
PHP中创建和验证哈希的简单方法实探
Jul 06 PHP
php类的定义与继承用法实例
Jul 07 PHP
部署PHP时的4个配置修改说明
Oct 19 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
PHP defined()函数的使用图文详解
Jul 20 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
?生?D片??C字串
2006/12/06 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
php 抽象类的简单应用
2011/09/06 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
PHP小教程之实现链表
2014/06/09 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
PHP面向对象详解(三)
2015/12/07 PHP
PHP实现添加购物车功能
2017/03/06 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
python的多重继承的理解
2017/08/06 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
Python对wav文件的重采样实例
2020/02/25 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
中间件的定义
2016/08/09 面试题
给民警的表扬信
2014/01/08 职场文书
项目建议书怎么写
2014/05/15 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
个人培训总结
2015/03/05 职场文书
创业计划书之宠物店
2019/09/19 职场文书
八年级作文之友谊
2019/12/02 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL