首页 > 编程语言 >java限流

java限流

时间:2023-06-19 09:03:31浏览次数:48  
标签:return String phone 限流 key java CommonResult

@Component
public class LimiterUtil {
@Resource
private RedisTemplate<String, String> redisTemplate;

/**
 * 固定窗口限流算法
 *
 * @return true 限流  false 放行
 */
public boolean fixedWindow(String key, int count) {
    long countCache = redisTemplate.opsForValue().increment(key);
    return countCache > count;
}

/**
 * intervalTime 时间内 最多只能访问5次
 *
 * @param key          缓存key
 * @param currentTime  当前时间  new Date().getTime();
 * @param intervalTime 有效期
 * @param count        限流次数
 * @return true 限流 false 放行
 */
public boolean slidingWindow(String key, Long currentTime, Long intervalTime, int count) {
    //发送次数+1
    redisTemplate.opsForZSet().add(key, UUID.randomUUID().toString(), currentTime);
    // intervalTime是限流的时间
    int countCache = Objects.requireNonNull(redisTemplate.opsForZSet().rangeByScore(key, currentTime - intervalTime, currentTime)).size();
    return countCache > count; 
}
}

/**
*发送短信单位时间内次数限制采用的是slidingWindow()方法的参数。
*/
public CommonResult<Boolean> sendCode(String phone, String codeCachePre, Integer msgType) { if (StringUtil.isEmpty(phone)) { return CommonResult.failed(ResultCode.VALIDATE_FAILED); } ParamValidate.isNull(phone, "phone参数为空"); //同一个手机号码 发送次数限流 //同一个手机号每秒 最多只能发5次 boolean limit = limiterUtil.slidingWindow(RedisConstantPre.MESSAGE_LIMIT_KEY_PRE + phone, (new Date()).getTime(), 60000L, 5); if (limit) { return CommonResult.failed(ResultCode.SEND_MESSAGE_LIMIT); } CommonResult<MessageTemplateDto> commonResult = messageTemplateFeignClient.queryByMessageType(msgType); if (commonResult.getCode() != ResultCode.SUCCESS.getCode()) { log.error("短信模板不存在,tye={}", msgType); return CommonResult.failed(ResultCode.VALIDATE_FAILED); } MessageTemplateDto messageTemplateDto = commonResult.getData(); //生成随机验证码 String code = RandomUtil.randomNumbers(6); log.info("登录发送验证码:{}", code); //发送验证码 String content = messageTemplateDto.getContent(); //验证码占位符 String newContent = content.replace(messageTemplateDto.getContentParam(), code); //调用MQ 异步发送短信验证码 phoneMessageProducer.sendPhoneMessage(phone, newContent); //存到redis中 设置有效期 60秒 //60秒后需要重现发送 redisConfig.set(codeCachePre + phone, code, 60); return CommonResult.success(Boolean.TRUE); }

 

标签:return,String,phone,限流,key,java,CommonResult
From: https://www.cnblogs.com/privateLogs/p/17490213.html

相关文章

  • daka :p java day 1!
    书写helloworld!publicclasshelloworld{publicstaticvoidmain(String[]arges){System.out.println("helloworld!");}}  ......
  • Java基础
    数据类型INFINITY和NaN//INFINITY定义publicstaticfinaldoublePOSITIVE_INFINITY=1.0/0.0;publicstaticfinaldoubleNEGATIVE_INFINITY=-1.0/0.0;publicstaticfinalfloatPOSITIVE_INFINITY=1.0f/0.0f;publicstaticfinalfloatNEGATIVE_INFINITY......
  • Java Websocket 01: 原生模式 Websocket 基础通信
    目录JavaWebsocket01:原生模式Websocket基础通信JavaWebsocket02:原生模式通过Websocket传输文件Websocket原生模式原生模式下服务端通过@ServerEndpoint实现其对应的@OnOpen,@OnClose,@OnMessage,@OnError方法客户端创建WebSocketClient实现对应的......
  • 到底什么是php javascript
    php就是将 静转动(静态页面转为动态页面),有些页面在你访问之前他不是真实存在的,而是依据你提交的东西而动态生成的html页面,比如使用搜索引擎时候,你提交了关键字php,搜索引擎会到数据库中找到与php相关的信息,然后将这些信息排序和组装成一个html页面,将这个实时生成的页面返回给你的浏......
  • Azure Blob Storage Java SDK使用SAS Token授权读取文件403报错
    问题描述代码如下,内容十分简单,只是listpath的操作。点击查看代码DataLakeServiceClientdataLakeServiceClient=newDataLakeServiceClientBuilder().endpoint(blob).sasToken(sasToken).buildClient();DataLakeFileSystemClienttestFs=dataLakeServic......
  • linux java调用sh脚本
    1、2、importorg.jeecg.zhongyi.auto_dep.util.CommandStreamGobbler;importorg.jeecg.zhongyi.util.LogbackUtil;importorg.jeecg.zhongyi.util.vo.Result;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.LinkedList;importjava.......
  • linux sh脚本一键自动部署 前端项目、docker项目、java项目
    1、2、静态前端,admin_xx_auto_deployment.sh#!/bin/bashsource/etc/profile#.~/.bash_profilecd/data/yyyyy_temp/xx_admin_code/yyyyy2-admingitpullPATH=$PATH:./node_modules/.binecho$PATHnpmrunbuild:test1cp-r/data/yyyyy_temp/xx_admin_code/yyyyy2-ad......
  • SQL调优:让Java内存分担计算
    作者: 剽悍一小兔我们在工作中,经常会因为一条慢sql调半天。这一节,我给大家介绍一种提升查询效率的思路,那就是让Java内存帮我们分担一些运算。案例还是采用springBoot日记本系统,源码下载地址和教程在文末。先改一个BUG之前遗留了一个BUG需要我们解决,就是在日记的详情页,日记类型没......
  • Java百炼成仙1.1 他叫叶小凡
    第1章陨铁山脉篇1.1他叫叶小凡“这里是哪里?”男子揉了揉有些迷糊的脑袋,环顾四周,只见一望无际的平原。他的白色服饰在强烈的阳光下发出闪亮的光芒,仿佛是一抹清新的色彩点缀在这沉寂的荒野之中。天空中阳光透过透明的大气层倾泻而下,温暖的光线照耀着男子苍白的脸庞。空气中的尘埃让......
  • Java代码精简之道-10条代码精简方案
    场景一、Java中利用try-with-resource语句JDK7开始新增了对需要关闭资源处理的特殊语法try-with-resource。所有实现Closeable接口的“资源”,均可采用try-with-resource进行简化。例如InputStream,OutputStream,Connection,Statement,ResultSet等接口都实现了,使用try-with-reso......