PHP如何基于redis的分布式锁防止高并发重复请求-php教程

资源魔 87 0

需要:

咱们先举个某零碎验证的列子:(A渠道零碎,营业B零碎,内部厂商C零碎)

(1)B营业零碎挪用A渠道零碎,验证传入的手机、身份证、姓名三因素能否分歧。

(2)A渠道零碎再挪用内部厂商C零碎。

(3)A渠道零碎将后果前往给B营业零碎。

这3个进程中,(2)进程,挪用内部厂商是需求计费的。

当B营业零碎并发量很高时,有100笔相反的三因素校验,因为是相反的三因素,A渠道只需挪用一次厂商便可晓得后果。为了避免正在某一申请还没呼应完结的同时,其余申请也去挪用内部零碎,这个时分就需求加锁解决

散布式锁的特性

 ● 原子性:同一时辰,只能有一个机械的一个线程失去锁;

 ● 可重入性:同一工具(如线程、类)能够反复、递归挪用该锁而没有发作死锁;

 ● 可梗阻:正在不取得锁以前,只能梗阻期待直至取得锁;

 ● 高可用:哪怕发作顺序毛病、机械损坏,锁依然可以失去被猎取、被开释;

 ● 高功能:猎取、开释锁的操作耗费小。

要完成:加锁,减锁,锁超时

完成形式能够是:数据库 mc redis 零碎文件 zookeeper

我如今就是渠道零碎,当100个相反的营业申请通报过去,我的第一个申请要先加锁,而后申请内部厂商零碎,等呼应后果当前,拔出另外一个key中,而后再删除了锁。

其余申请先去猎取下锁,假如曾经存正在锁就轮寻期待,假如锁没有正在了,间接去查问后果。

假如第一个申请失败了,后果并无拔出到位,就持续猎取锁再去查问内部零碎。

猎取锁:

$redis->set('lock:手机号&身份证&姓名', 1, ['nx', 'ex'=>10]);

开释锁:

就是间接删除了这个key

锁超时:

lock的key有超不时间

新版的redis set饬令就能够完成散布式锁,能够同时完成假如没有存正在时才去set以及超不时间两项。


<?php
$redis=new Redis();
$redis->connect("127.0.0.1",6379);
//高并发时避免反复申请

//渠道零碎通报过去的key
$lockKey='lock:18806767777&37781991111629092&taoshihan';
$resultKey='res:18806767777&37781991111629092&taoshihan';

//假如曾经查问过值,能够间接前往
$info=$redis->get($resultKey);
if($info){
    exit($info);
}

//假如不值的,猎取锁
$lock=$redis->set($lockKey, 1, ['nx', 'ex'=>10]);
if($lock){
    //申请内部零碎猎取后果,比方呼应后果比拟慢
    sleep(8);
    $info='{"name":"taoshihan"}';
    $ret=$redis->set($resultKey,$info);
    if($ret){
        //删除了锁
        $redis->del($lockKey);
        exit($info);
    }
}
echo "请稍后重试!";

保举学习:PHP教程

以上就是PHP若何基于redis的散布式锁避免高并发反复申请的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 Redis

抱歉,评论功能暂时关闭!