当前位置:首页 > 日记 > 正文

PHP使用Redis实现防止大并发下二次写入的方法

PHP使用Redis实现防止大并发下二次写入的方法

本文实例讲述了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+redis数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

相关文章

PS怎么设置画布大小?ps画布大小设

PS怎么设置画布大小?ps画布大小设

设置,方法,大小,电脑软件,PS,有人在使用PS时,可能图像太小不够用,或者是像素不够太低等等之类,其实还是有一个方法改变这一现象的,下面介绍的便是这种方法的过程,希望大家能够喜欢!步骤:1、先打开PS,然后看见上方有一个文件 2、打开文件之后,点击新…

php获取客户端IP及URL的方法示例

php获取客户端IP及URL的方法示例

方法,客户端,示例,电脑软件,php,本文实例讲述了php获取客户端IP及URL的方法。分享给大家供大家参考,具体如下:function getonlineip(){//获取用户ip if($_SERVER['HTTP_CLIENT_IP']) { $onlineip=$_SERVER['HTTP_CLIENT_IP']; //用户…

Photoshop结合AE制作逐帧的卡通gif

Photoshop结合AE制作逐帧的卡通gif

动态,表情,卡通,电脑软件,Photoshop,把静态表情转换成动态表情有很多方法,本教程会用到逐帧动画和关键帧动画两种方法(工具分别是PS 和AE),用一个表情做示例,希望大家学完后能融会贯通,举一反三。12 阅读全文教程结束,以上就是Photoshop结合AE…

Javascript中数组去重与拍平的方法

Javascript中数组去重与拍平的方法

数组去重,方法,示例,电脑软件,Javascript,数组的判断在说如何进行数组的去重和拍平之前,先说一下怎么判断数组,因为要进行数组的处理当然要先判断下传过来的数据是不是数组。首先我们都知道js的数据类型只有5种,分别是Undefined、Null、Boolea…

php使用flock阻塞写入文件和非阻塞

php使用flock阻塞写入文件和非阻塞

写入文件,非阻塞,实例,电脑软件,php,阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时)<?php $file = fopen("test.txt","w+"); $t1 = microtime(TRUE); if (flock($file,LOCK_EX)) { sleep(10); fwrite($file,"Write…

qq签名经典语句搞笑

qq签名经典语句搞笑

语句,搞笑,经典,大全,电脑软件,  一句qq签名经典语句搞笑: 喜欢我的人都是好人,不喜欢我的人都是坏人,讨厌我的都不是人。下面小编给大家分享了关于qq签名经典语句搞笑,希望你喜欢。qq签名经典语句搞笑大全1) 你这么牛&times; 为啥天安门没挂…

Photoshop合成创意的暗黑风格骷髅

Photoshop合成创意的暗黑风格骷髅

创意,场景,骷髅头,风格,女孩,本教程主要使用Photoshop合成创意的暗黑风格骷髅头女孩的场景图,整体的思路很不错,喜欢的朋友让我们一起来学习吧。教程开始前,先通过一个小动画来看一下操作的思路DONGDIHUA-合成教程的动态图12 阅读全文教程结…

JavaScript中匿名函数的递归调用

JavaScript中匿名函数的递归调用

递归调用,匿名函数,电脑软件,JavaScript,不管是什么编程语言,相信稍微写过几行代码的同学,对递归都不会陌生。 以一个简单的阶乘计算为例:function factorial(n) { if (n <= 1) { return 1; } else { return n * factorial(n-1); }}…

Excel制作迟到早退旷工的考勤表

Excel制作迟到早退旷工的考勤表

考勤表,电脑软件,Excel,Excel里面,如何根据打开的时间,算出员工是否迟到、早退或是旷工呢?这样的考勤表如何使用Excel来做。下面我们先看下表。上表中,A列记录的是来上班的时间,即进入公司就打卡,该时间是上班的时间。B列是员工离开公司的时间,…

PS合成童话故事中毛骨悚然的悬浮场

PS合成童话故事中毛骨悚然的悬浮场

毛骨悚然,童话故事,场景,电脑软件,PS,除了令人毛骨悚然的悬浮房屋,你会掌握如何创建一些非常酷的3D风格的字体效果,如何有效地结合你的场景,以及如何使用透视线的角度。最终效果1、新建1300 * 1833 px,分辨率为150 px文件。 2、把素材拖入文档,…

win10分辨率设置

win10分辨率设置

设置,分辨率,电脑软件,win10分辨率怎么设置呢?首先我们需要更新一下显卡驱动,让win10系统识别最优的分辨率状态,接下来的步骤让小编详细的介绍win10分辨率设置的方法。win10分辨率设置方法步骤如下:1.点击右下角的&ldquo;通知中心图标&rdquo;>…

Angularjs 实现移动端在线测评效果

Angularjs 实现移动端在线测评效果

移动端,推荐,在线,效果,电脑软件,注:此文所用的angular版本为 1.6一、运行效果图二、需求1. 点击选项时,背景变为黄色(即选中状态),并且自动切换到下一题2. 切换到下一题时,顶部进度随之改变3. 选中时要把对应的分值记录下来(因为要根据分值算出最…