首页 > 其他分享 >接口防止短时高并发、数据加锁

接口防止短时高并发、数据加锁

时间:2023-08-09 16:04:25浏览次数:37  
标签:加锁 return 接口 并发 短时 lockName public


什么是短时高并发

  高并发是指在极短单位时间内,有很多用户同时的访问同一 API 接口或者 Url 地址,造成极多个请求同时发起到服务器。


最近在安全检测短时高并发检测注册接口的时候,用户账号是Email,如果没做任何处理的话,通过短时高并发同一个邮箱会注册成功多次,这是错误的
我的解决办法是通过加锁   
下面是代码实现:

  工具类 RedissonUtil

@Component
public class RedissonUtil {

    // 静态属性注入
    private static RedissonClient redissonClient;
    @Autowired
    public void setRedisson(RedissonClient redissonclient) {
        RedissonUtil.redissonClient = redissonclient;
    }

    // 获取分布式锁
    public static RLock getLock(String lockName) {
        return redissonClient.getLock(lockName);
    }

    // 尝试获取分布式锁,设置超时时间和过期时间
    public static boolean tryLock(String lockName, long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
        RLock lock = redissonClient.getLock(lockName);
        return lock.tryLock(waitTime, leaseTime, unit);
    }

    // 释放分布式锁
    public static void unlock(String lockName) {
        RLock lock = redissonClient.getLock(lockName);
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

在你想要加锁的方法里面实现:

 @Override
    public AjaxResult userRegister(SysUserOkinawa sysUserOkinawa) {
        String lockName = sysUserOkinawa.getEmail();  // 获取邮箱
        try{
            boolean isLocked = RedissonUtil.tryLock(lockName, 10, 10,TimeUnit.SECONDS); // 尝试获取分布式锁,设置超时时间和过期时间
            if(!isLocked){
                return AjaxResult.error(String.format("userRegister-getlockerror-{0}",lockName));
            }
            log.info("message:调用注册接口信息");
        //验证邮箱是否存在
            Integer count = sysUserOkinawaMapper.getByEmail(sysUserOkinawa.getEmail());
            if(count != 0){
                return AjaxResult.error("このメールアドレスは既に使われています。");
            }
            //业务处理保存数据库return AjaxResult.success("注册成功!");
        }catch (Exception e){
            log.info("message:调用注册接口失败");
            log.info("message:注册失败{0}",e.toString());
            return AjaxResult.error("注册失败"+e);
        }finally {
            RedissonUtil.unlock(lockName);   // 最后一定要记得释放锁
        }
    }
上面两段代码,实现了简单通过上锁来避免结构被短时高并发攻击,造成邮箱注册多次情况出现

  不是所有接口都需要,但是该有的要预防  

标签:加锁,return,接口,并发,短时,lockName,public
From: https://www.cnblogs.com/ljknlb/p/17616998.html

相关文章

  • MySQL并发开启事务与隔离级别相关
    ......
  • 高并发海量数据爬取,哪种语言更适合?
    今天我要和大家聊一聊一个让程序员们头疼不已的话题——高并发海量数据爬取。在这个信息爆炸的时代,我们需要从互联网上抓取大量的数据,便于进行分析、挖掘和应用。但是面对庞大的数据量和复杂的网络环境,我们应该选择哪种编程语言来完成这项任务呢?让我们一起来探讨一下吧!首先,我们让来......
  • 高并发限流
    转载:java充电社最近公司在搞年终大促,随着各种营销活动“组合拳”打出,进站流量时不时会有一个小波峰,一般情况下,当然是流量越多越好,前提是系统能杠地住。大家都知道,一个分布式系统,有两个“弃车保帅”的策略:限流和熔断,这期,我们就来讨论一下分布式系统的限流。探探限流带着问题走......
  • c#多线程并发执行一个操作函数
    有时候我们进行很多的数据对比运算时,单线程的程序显得很慢,这个时候可以用多线程并发运行:intmaxThread=10;//10个并发线程intcurrTNum=0;WaitHandle[]whs=newWaitHandle[maxThread];//WaitHanle类MSDN上的定义:封装了......
  • Go的任务调度单元与并发编程
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言本文主要介绍Go语言、进程、线程、协程的出现背景原因以及Go语言如何解决协程的问题和并发编程的实现,本文的阅读时长约在15-20分钟......
  • 并发编程 - 模式与应用
    限制1、限制对CPU的使用单核CPU下,while(true)里如果什么都不干,CPU会空转占用会很快达到100%。这时while(true)里哪怕用sleep(1)也会大幅降低cpu占用sleep实现while(true){try{Thread.sleep(50);}catch(InterruptedExceptione){e.prin......
  • 并发中atomic BUG分享
    在使用Java做性能测试的过程中,遇到过很多自己抗自己的坎儿。在经历过风风雨雨之后,自认为已经是个并发编程的老司机,没想到前两天又丢进了同一个坑中。保持操作的原子性!!!保持操作的原子性!!!保持操作的原子性!!!重要的事情写三遍。事情是这样,要写一个脚本,需求是对所有的用户进行初始化(......
  • 5个高并发场景优化的衡量指标
    本文分享自华为云社区《【高并发】性能优化有哪些衡量指标?需要注意什么?》,作者:冰河。面试官:平时工作中有没有做过一些性能优化相关的工作呢?首先,我们来分析下面试官的这个问题。其实,以我本人招聘面试的经验来说,如果面试官问出了这样的一个问题。本质上不只是想让面试者简单的回......
  • 高并发系统架构
    可以分为以下6点:系统拆分缓存MQ分库分表读写分离ElasticSearch系统1.系统拆分将一个系统拆分为多个子系统,用dubbo来搞。然后每个系统连一个数据库,这样本来就一个库,现在多个数据库,不也可以扛高并发么。2.缓存大部分的高并发场景,都是读多写少,那你完全可以在数据库和......
  • java多线程并发面试题总结(史上最全40道)
    1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个......