•   欢迎来到21NN网.
  •   请记住本站网址www.21nn.cn

PHP怎样基于redis的分布式锁防备高并发反复要求【php教程】,PHP,redis

摘要: 需求:我们先举个某体系考证的列子:(A渠道体系,营业B体系,外部厂商C体系)(1)B营业体系挪用A渠道体系,考证传入的手机、身份证、姓名三要素是不是一致。(2)A渠道体系再挪用...

需求:

我们先举个某体系考证的列子:(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的分布式锁防备高并发反复要求的细致内容,更多请关注ki4网别的相干文章!

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

公众号二维码

微信公众号