RateLimiter配合ConcurrentHashMap对用户进行简单限流
对于小不点的项目来说,RateLimiter配合ConcurrentHashMap可以对用户进行简单的限流,防止用户频繁刷量或者高频请求。
RateLimiter 是 Guava 下的一个包,采用的是令牌桶算法:以一个恒定的速率向固定容量大小的桶中放入令牌,当有流量来的时候从桶中取出一个令牌。如果桶中没有可用的令牌时就丢弃请求或者阻塞。
ConcurrentHashMap 是一个可以在并发环境下使用的 HashMap,通俗点说就是线程安全的。
大致的思路也很简单:当一个请求过来时,根据用户的 ID 从 ConcurrentHashMap 取出 RateLimiter,然后尝试取出令牌,如果获取失败,则提示用户请求过于频繁;否则进行业务处理。
首先在 Controller 类中创建一个 ConcurrentHashMap 对象。
private final static Map<Integer, RateLimiter> outMoneyLimitMap = new ConcurrentHashMap<>();
然后是请求的处理代码。
public ModelAndView submitOut() {RateLimiter rateLimiter = null;if (outMoneyLimitMap.containsKey(uid)) {logger.debug("包含有该uid");rateLimiter = outMoneyLimitMap.get(uid);} else {logger.debug("没有该uid");// 需要新增,一秒内 0.1 个令牌(10秒内一个令牌)rateLimiter = RateLimiter.create(0.1);outMoneyLimitMap.put(uid, rateLimiter);}if(!rateLimiter.tryAcquire()) {throw new OrderException("请求过于频繁");}// 正常业务处理
}
RateLimiter.create()
可以创建一个限流器,参数可以是 double,例子中为 0.1,即 10 秒内一个令牌(便于模拟)。
然后通过 rateLimiter.tryAcquire()
尝试获取令牌,如果获取失败,就提示用户。否则正常业务处理。
整体思路非常非常简单,实现起来也非常容易,是一种非常好用的限流示例。
别瞅了,点赞就对了(你最美你最帅,
RateLimiter配合ConcurrentHashMap对用户进行简单限流相关推荐
- redis实现简单限流
首先我们给出限流的定义: 1. 限定某个行为在指定时间内被允许的最大次数 2. 限定某个用户的某个行为在指定时间内被允许的最大次数 其实二者差不多,前面一句是限定所有人,后面的是限定了每个用户 注意 ...
- 设计一个基于用户的API限流策略 Rate Limit
设计一个基于用户的API限流策略 Rate Limit 应用场景 API接口的流量控制策略:缓存.降级.限流.限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的.限流策略 ...
- 一个基于用户的API限流策略 Rate Limit
1. 限流场景 在开发高并发系统时,有很多种方法可用来保护系统:缓存.降级.限流等. 缓存:提升系统访问速度,增大系统处理能力 降级:服务出现问题或影响核心流程的性能时,需要暂时屏蔽,待高峰过去或问题 ...
- 基于用户的API限流策略
应用场景 API接口的流量控制策略:缓存.降级.限流.限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的.限流策略虽然降低了服务接口的访问频率和并发量,却换取服务接口和业 ...
- 用拦截器+注解+cookie进行简单限流访问案例
文章目录 1.写限流注解 2.redis相关类 3.添加自定义拦截器: 4.controller中使用注解 之前有一篇用aop+redis+lua进行限流的案例: springboot中使用aop+r ...
- SpringMvc 限流之 RateLimiter
概念 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待.降级等处理 常用限流算法 常用的限流算法有两种:漏桶算法 ...
- 超简单,人人都能弄明白的 6 种限流实现方案
前言 为了上班方便,去年我在南山附近租了一个房间,这样离我上班的地方就近了,它为我节约了很多的时间成本,我可以用它来做很多有意义的事,最起码不会因为堵车而闹心了,幸福感直线上升. 但即使这样,生活也有 ...
- Kafka 压缩、限流和 SASL_PLAIN 、 SASL_SCRAM-SHA-256简单认证
限流方式 方式 优点 缺点 client id 简单便捷 client id,一次只能有一个生产者实例,只能单并发 user 可以多 producer 同时进行,可与client id 进行组合,可以 ...
- 教你从0到1搭建秒杀系统-限流
本文是秒杀系统的第二篇,主要讲解接口限流措施.接口限流其实定义也非常广,接口限流本身也是系统安全防护的一种措施,在面临高并发的请购请求时,我们如果不对接口进行限流,可能会对后台系统造成极大的压力,尤其 ...
最新文章
- 优雅地在 Mac上使用 IDE 查看open-jdk源码
- vba手机号码归属_Android手机号码归属地的查询
- python菜鸟基础教程-终于懂得python入门菜鸟教程
- STM32中GPIO的8种模式
- python列表去掉特定项_python实现删除列表中某个元素的3种方法
- MFC的程序,不想显示窗口,任务栏里也不显示
- 【数据库】Oracle用户、授权、角色管理
- python爬虫多url_Python爬虫抓取多个URL写入本地文件
- MATLAB语音识别
- Java基础之十年面试杂记
- Java小游戏的音乐播放
- 白话大数据开发之Azkaban问题一
- VM下Centos7虚拟机无法进入图形界面并提示Started Virtualization daemon...ices..shutdown
- LiteOS学习笔记-9LiteOS SDK oc流程之MQTT
- OpenGL环境的配置(GLUT安装教程)
- Synctoy定时自动同步数据
- SAP中MD04中交货计划行例外信息07的分析
- 父进程创建五个子进程
- python去哪个城市就业比较好_学完Python的7大就业方向,哪个赚钱多
- 高级查询习题1-46
热门文章
- 极客的Linux常用命令速查手册
- Black Hat Python3 Chapter4
- CSDN 博客 修改文章搜索为 bing 搜索,且只搜索自己的博客的方法
- WslRegisterDistribution failed with error: 0x80070050
- 将军百战声名裂:泣血说李陵
- matlab中resample重采样函数
- 睡眠 应该用 a加权 c加权_创3年新高的创业板,应该如何选择
- Illegal character in query Url中含有{}
- Vue.js全家桶仿哔哩哔哩动画 (移动端APP)
- Android官方文档—APP清单(uses-feature)