需求:

我们先举个某系统验证的列子:(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 "请稍后重试!";

服务器高并发时请求报错_基于redis的分布式锁防止高并发重复请求相关推荐

  1. yii2 请求外部api_[PHP] 基于redis的分布式锁防止高并发重复请求

    需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. ( ...

  2. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  3. redis使用sysc超时_基于redis的分布式锁实现

    随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...

  4. 分布式锁的三种实现方式_基于 redis 的分布式锁实现

    云龙 资深运维开发工程师,负责游戏系统配置管理平台的设计和开发,目前专注于新 CMDB 系统的开发,平时也关注运维自动化,devops,python 开发等技术. 背景 CMDB 系统里面的机器数据会 ...

  5. redis分布式锁java代码_基于redis实现分布式锁

    " 在上一篇文章中介绍了动态配置定时任务,其中的原理跟spring 定时任务注解@Scheduled一样的,都是通过线程池和定义执行时间来控制.来思考一个问题,如果我们的定时任务在分布式微服 ...

  6. java实现分布式redis锁_使用redis实现分布式锁

    # 简介: 当高并发访问某个接口的时候,如果这个接口访问的数据库中的资源,并且你的数据库事务级别是可重复读(Repeatable read)的话,确实是没有线程问题的,因为数据库锁的级别就够了:但是如 ...

  7. java redis id生成器_基于redis的分布式ID生成器

    项目地址 基于redis的分布式ID生成器. 准备 首先,要知道redis的EVAL,EVALSHA命令: 原理 利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID. 生成的I ...

  8. lr之并发时检测点报错

    使用lr进行性能测试前,一般会对脚本进行回放,回放无误后,才建立场景进行多用户并发即压测. 以下是我在回放时脚本未报错误,检查点也无误,但是进行压测时,就会报检测点找不到的总结,希望对大家有用. 现象 ...

  9. 使用vscode remote ssh功能远程连接服务器或树莓派时,报错Setting up SSH tunnel的终极解决办法,全网仅此一份

    当你想用vscode remote ssh 功能远程开发linux服务器.树莓派时,.vscode-server文件创建完成,但是一直显示卡在 Setting up SSH Host <你的用户 ...

最新文章

  1. 把html变成桌面的软件,5 分钟把任意网站变成桌面软件
  2. Oracle入门(十四.13)之带参数的游标
  3. redis结合springboot 无法注入redisTemplate问题
  4. Axure RP 8.1最新激活码
  5. RT-Thread配置SPI-Flash(W25Q256)
  6. c++实现查询天气预报
  7. lisp画弯箭头_下篇-大神总结:CAD制图的43个技巧,都学会你就逆天了!
  8. 奥运门票系统down机的技术问题
  9. 狼图腾--满族为什么能以少统多
  10. JAVA一些方法技巧
  11. 软件开发基于JavaScript实现快速转换文本语言(繁体中文和简体中文)_javascript技巧
  12. Android 读取Txt文件内容
  13. 双目摄像头三种标定方式标定结果对比
  14. 微型计算机的外储存器是指什么,微型计算机的外储存器是指
  15. 电机控制编程的数学运算优化方案
  16. mysql查询的优化
  17. i.MX - RT1052调教总结
  18. Redux 源码解读 —— 从源码开始学 Redux
  19. 利用循环解决矩阵nan值(错误解决)
  20. out of office ,out of the office,OOO的区别和联系

热门文章

  1. MySQL日期和时间类型
  2. TensorFlow索引与切片语句
  3. 坚持,这两个字非常重要!
  4. Oracle12g添加c##scott用户
  5. java网络编程(七)
  6. 蓝桥杯java第四届决赛第二题--连续奇数和
  7. hibernate教程--关联关系的映射详解
  8. 算法--2016搜狐面试:搜狐员工放假了,都玩什么?
  9. 网络编程应用:基于TCP协议【实现文件上传】--练习
  10. 无法识别的配置节appsettings_人脸识别门禁考勤系统安装使用注意事项