对于小不点的项目来说,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对用户进行简单限流相关推荐

  1. redis实现简单限流

    首先我们给出限流的定义: 1. 限定某个行为在指定时间内被允许的最大次数 2. 限定某个用户的某个行为在指定时间内被允许的最大次数 其实二者差不多,前面一句是限定所有人,后面的是限定了每个用户 注意 ...

  2. 设计一个基于用户的API限流策略 Rate Limit

    设计一个基于用户的API限流策略 Rate Limit 应用场景 API接口的流量控制策略:缓存.降级.限流.限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的.限流策略 ...

  3. 一个基于用户的API限流策略 Rate Limit

    1. 限流场景 在开发高并发系统时,有很多种方法可用来保护系统:缓存.降级.限流等. 缓存:提升系统访问速度,增大系统处理能力 降级:服务出现问题或影响核心流程的性能时,需要暂时屏蔽,待高峰过去或问题 ...

  4. 基于用户的API限流策略

    应用场景 API接口的流量控制策略:缓存.降级.限流.限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的.限流策略虽然降低了服务接口的访问频率和并发量,却换取服务接口和业 ...

  5. 用拦截器+注解+cookie进行简单限流访问案例

    文章目录 1.写限流注解 2.redis相关类 3.添加自定义拦截器: 4.controller中使用注解 之前有一篇用aop+redis+lua进行限流的案例: springboot中使用aop+r ...

  6. SpringMvc 限流之 RateLimiter

    概念 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待.降级等处理 常用限流算法 常用的限流算法有两种:漏桶算法 ...

  7. 超简单,人人都能弄明白的 6 种限流实现方案

    前言 为了上班方便,去年我在南山附近租了一个房间,这样离我上班的地方就近了,它为我节约了很多的时间成本,我可以用它来做很多有意义的事,最起码不会因为堵车而闹心了,幸福感直线上升. 但即使这样,生活也有 ...

  8. Kafka 压缩、限流和 SASL_PLAIN 、 SASL_SCRAM-SHA-256简单认证

    限流方式 方式 优点 缺点 client id 简单便捷 client id,一次只能有一个生产者实例,只能单并发 user 可以多 producer 同时进行,可与client id 进行组合,可以 ...

  9. 教你从0到1搭建秒杀系统-限流

    本文是秒杀系统的第二篇,主要讲解接口限流措施.接口限流其实定义也非常广,接口限流本身也是系统安全防护的一种措施,在面临高并发的请购请求时,我们如果不对接口进行限流,可能会对后台系统造成极大的压力,尤其 ...

最新文章

  1. 优雅地在 Mac上使用 IDE 查看open-jdk源码
  2. vba手机号码归属_Android手机号码归属地的查询
  3. python菜鸟基础教程-终于懂得python入门菜鸟教程
  4. STM32中GPIO的8种模式
  5. python列表去掉特定项_python实现删除列表中某个元素的3种方法
  6. MFC的程序,不想显示窗口,任务栏里也不显示
  7. 【数据库】Oracle用户、授权、角色管理
  8. python爬虫多url_Python爬虫抓取多个URL写入本地文件
  9. MATLAB语音识别
  10. Java基础之十年面试杂记
  11. Java小游戏的音乐播放
  12. 白话大数据开发之Azkaban问题一
  13. VM下Centos7虚拟机无法进入图形界面并提示Started Virtualization daemon...ices..shutdown
  14. LiteOS学习笔记-9LiteOS SDK oc流程之MQTT
  15. OpenGL环境的配置(GLUT安装教程)
  16. Synctoy定时自动同步数据
  17. SAP中MD04中交货计划行例外信息07的分析
  18. 父进程创建五个子进程
  19. python去哪个城市就业比较好_学完Python的7大就业方向,哪个赚钱多
  20. 高级查询习题1-46

热门文章

  1. 极客的Linux常用命令速查手册
  2. Black Hat Python3 Chapter4
  3. CSDN 博客 修改文章搜索为 bing 搜索,且只搜索自己的博客的方法
  4. WslRegisterDistribution failed with error: 0x80070050
  5. 将军百战声名裂:泣血说李陵
  6. matlab中resample重采样函数
  7. 睡眠 应该用 a加权 c加权_创3年新高的创业板,应该如何选择
  8. Illegal character in query Url中含有{}
  9. Vue.js全家桶仿哔哩哔哩动画 (移动端APP)
  10. Android官方文档—APP清单(uses-feature)