多维度访问次数限制策略

2024-01-14 13:58

本文主要是介绍多维度访问次数限制策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

类型维度
梯度维度
时间段维度

配置文件:

[{"seconds": 10,"times": 5,"type": "user_method","errMsg": ""},{"seconds": 30,"times": 15,"type": "user_method","errMsg": ""},{"times": 100,"type": "user","errMsg": ""},{"times": 200,"type": "method","errMsg": ""},{"times": 200,"type": "range_time","range_time": "18:00-19:00","errMsg": ""},{"times": 200,"type": "range_time","range_time": "19:00-20:00","errMsg": ""}
]

实现代码:

public RequestLimit tryRequest(final List<RequestLimit> requestLimitList, final String methodName, final Integer userId) {Assert.isTrue(StringUtil.isNotBlank(methodName), "tryRequest param methodName is empty!");Assert.isTrue(userId != null && userId > 0, "tryRequest param userId is empty!");Object ret = runTask(new Callback() {@Overridepublic RequestLimit onTask(Jedis jedis) {boolean flag = true;log.info(String.format("[reqLimit_request] \t methodName, userId\t : %s,%s", methodName, userId));for (RequestLimit limit : requestLimitList) {Integer seconds = limit.getSeconds();Integer times = limit.getTimes();String type = limit.getType() ;if (flag && "user_method".equals(type)) {flag = limitUserMethod(jedis, seconds, times, methodName, userId);} else if (flag && "user".equals(type)) {flag = limitUser(jedis, times, userId);} else if (flag && "method".equals(type)) {flag = limitMethod(jedis, times, methodName);} else if (flag && "range".equals(type)) {flag = limitRangeTime(jedis, limit, userId);}if (!flag) {return limit;}}log.info(String.format("[reqLimit_pass] \t seconds, methodName, userId :\t %s,%s", methodName, userId));return null;}});return ret == null ? null : (RequestLimit) ret;
}private boolean limitRangeTime(Jedis jedis, RequestLimit limit, Integer userId) {long nowTime = System.currentTimeMillis();long rangeStartTime = limit.getRangeStartTime();long rangeEndTime = limit.getRangeEndTime();Integer times = limit.getTimes();PreconditionsUtil.checkArguments(times != null, "400", "RequestLimit times is null");if (rangeStartTime <= nowTime && nowTime < rangeEndTime) {long seconds = rangeEndTime - nowTime;log.info(String.format("[reqLimit_error:USER_RANGE_TIME] \t range_time, times, seconds, userId :\t %s,%s,%s,%s",limit.getRangeTime(), times, seconds, userId));final String key = String.format(USER_RANGE_TIME_REQUEST_LIMIT, rangeEndTime, userId);String mistr = jedis.get(key);if (mistr == null || Integer.parseInt(mistr) == 0) {jedis.incr(key);jedis.expire(key, (int) seconds);} else if (jedis.incr(key) >= times) {log.error(String.format("[reqLimit_error:USER_RANGE_TIME] \t times, seconds, userId :\t %s,%s,%s",jedis.get(key), seconds, userId));return false;}}return true;
}private boolean limitUser(Jedis jedis, Integer times, Integer userId) {long dayEndTime = DateUtil.getDayEndTime();final String key = String.format(USER_REQUEST_LIMIT, dayEndTime, userId);long seconds = dayEndTime - System.currentTimeMillis();String mistr = jedis.get(key);log.info(String.format("[reqLimit_error:USER] \t times, seconds, userId :\t %s,%s,%s",times, seconds, userId));if (mistr == null || Integer.parseInt(mistr) == 0) {jedis.incr(key);jedis.expire(key, (int) seconds);} else if (jedis.incr(key) >= times) {log.error(String.format("[reqLimit_error:USER] \t times, seconds, userId :\t %s,%s,%s",jedis.get(key), seconds, userId));return false;}return true;
}private boolean limitMethod(Jedis jedis, Integer times, String methodName) {long dayEndTime = DateUtil.getDayEndTime();final String key = String.format(METHOD_REQUEST_LIMIT, dayEndTime, methodName);long seconds = dayEndTime - System.currentTimeMillis();log.info(String.format("[reqLimit_error:METHOD] \t times, seconds, methodName :\t %s,%s,%s",times, seconds, methodName));String mistr = jedis.get(key);if (mistr == null || Integer.parseInt(mistr) == 0) {jedis.incr(key);jedis.expire(key, (int) seconds);} else if (jedis.incr(key) >= times) {log.error(String.format("[RequireRequestLimit_over:METHOD] \t times, seconds, methodName :\t",jedis.get(key), seconds, methodName));return false;}return true;
}private boolean limitUserMethod(Jedis jedis, Integer seconds, Integer times, String methodName, Integer userId) {final String key = String.format(METHOD_USER_REQUEST_LIMIT, seconds, methodName, userId);String mistr = jedis.get(key);log.info(String.format("[reqLimit_error:METHOD] \t times, seconds, methodName, userId :\t %s,%s,%s,%s",times, seconds, methodName, userId));if (mistr == null || Integer.parseInt(mistr) == 0) {jedis.incr(key);jedis.expire(key, seconds);} else if (jedis.incr(key) >= times) {log.error(String.format("[RequireRequestLimit_over:USER_METHOD] \t times, seconds, methodName, userId :\t",jedis.get(key), seconds, methodName, userId));return false;}return true;
}

这篇关于多维度访问次数限制策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605408

相关文章

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Nginx 访问 /root/下 403 Forbidden问题解决

《Nginx访问/root/下403Forbidden问题解决》在使用Nginx作为Web服务器时,可能会遇到403Forbidden错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录解决 Nginx 访问 /root/test/1.html 403 Forbidden 问题问题复现Ng

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾