java 限流器实现目录

  • 一、目的
  • 二、基本思路
  • 三、具体实现

一、目的

   并发问题处理:单位时间内请求次数过多,访问量较大时,报错提示用户。往往需要进行限流(每一秒限制请求几次)

注意: 这边说的访问量较大,是指有修改数据库数据; 正常的纯查询, 无需做限流; 当然,要做也是可以的

二、基本思路

   使用 redis 缓存加 scheduler 定时器进行实现;

   以每一小时为处理的时间单位,以每一秒为 job 的启动间隔;

   在一小时内,为每一秒都分配一定的令牌数量(即限流的次数);

   在每一秒内,请求了需限流的接口,则将令牌数量减 1 ;在这一秒内,一旦在请求时发现令牌数量为 0 时,则直接报错提示

三、具体实现

   1、使用定时器分配令牌数量:

 @Overrideprotected void execute() throws Throwable {logger.info("begin to run FreeProductTokenJob");// 1 个小时,每间隔 1 秒钟,发放指定数量的Tokenint maxTime = 60 * 60 * 1;for (int i = 0; i < maxTime; i++) {sleep(1000);redisAccess.stringOps().set(RedisKeyConstant.FREE_PRODUCT_TOKEN_KEY, String.valueOf(tokenCount));}redisAccess.keyOps().delete(RedisKeyConstant.FREE_PRODUCT_TOKEN_KEY);logger.info("End to run FreeProductTokenJob");}private void sleep(int millisecond) {try {Thread.sleep(millisecond);} catch (InterruptedException e) {logger.error("Sleep error", e);}}

   2、controller、service 消费令牌:

 @Injectprivate FreeProductTokenService freeProductTokenService;@Overridepublic FreeProductGetTokenResponse getToken() {FreeProductGetTokenResponse response = new FreeProductGetTokenResponse();response.setCanRunInto(freeProductTokenService.getToken());return super.setSuccessBaseResponse(response, "");}
 @Servicepublic class FreeProductTokenService {@Injectprivate RedisAccess redisAccess;public boolean getToken() {if (!redisAccess.keyOps().exists(RedisKeyConstant.FREE_PRODUCT_TOKEN_KEY)) {return true;}String count = redisAccess.stringOps().get(RedisKeyConstant.FREE_PRODUCT_TOKEN_KEY);if (StringUtils.hasText(count) && Integer.parseInt(count) > 0) {// 调用一次,令牌数量减 1redisAccess.stringOps().increment(RedisKeyConstant.FREE_PRODUCT_TOKEN_KEY, -1);return true;}return false;}}

   3、在需要限流的接口处调用:

 if (!productFavoriteWrapper.getToken()) {setErrorResponse(response, 180007, "当前购买人数过多,请稍后尝试");return response;}
 @Injectprivate FreeProductServiceAPI freeProductServiceAPI;public boolean getToken() {FreeProductGetTokenResponse response = freeProductServiceAPI.getToken();if (null == response || 200 != response.getCode()) {return false;}return response.isCanRunInto();}

java 限流器实现相关推荐

  1. java限流器_Smaphor(信号量)实现限流器

    Semaphore信号量 在管程被提出来之前用的是信号量. 信号量模型 一个计数器,一个等待队列,三个方法.计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问他们,这三个方法分别 ...

  2. java限流器简单实现

    package com.zeng.ratelimit;/*** @Description:限流器工厂* @Author jerry* Date 2020/1/3 9:52 上午**/ public c ...

  3. JAVA实现简单限流器(上)

    JAVA实现简单限流器 什么是限流器 在高并发的场景下,出于对系统的保护会对流量进行限制. 信号量实现限流器 提到限流器的实现方式,很容易可以想到信号量是与之类似的原理,都是允许一定数量的线程访问临界 ...

  4. java 实现限流器,可用于Rest接口请求处理 | Java工具类

    目录 前言 Maven依赖 代码 总结 前言 在工作中是否会碰到这样的场景,高并发的请求但是无法全部执行,需要一定的限流.如果你是使用的微服务框架,比如SpringCloud,可以使用Gateway增 ...

  5. Java:限流器(RateLimiter)原理与实现

    限流器(RateLimiter)主要有两种算法: 漏桶算法 令牌桶算法 它们都是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的算法. 漏桶算法 ...

  6. 基于Redis的分布式限流器Java实现

    常见的限流方案 从实现方式上来讲,限流可分为简单计数器限流.滑动窗口限流,基于漏桶和令牌桶算法的限流. 从是否支持多机拓展上来讲,又分为单机限流和分布式限流.单机限流大多通过线程锁的方式实现,而分布式 ...

  7. 精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用

    前言 上一篇万字长文 Java AQS队列同步器以及ReentrantLock的应用 为我们读 JUC 源码以及其设计思想做了足够多的铺垫,接下来的内容我将重点说明差异化,如果有些童鞋不是能很好的理解 ...

  8. jq实现文字个数限制_分布式系统高可用实战之限流器(Go 版本实现)

    限流器,顾名思义用来对高并发的请求进行流量限制的组件. 限流包括 Nginx 层面的限流以及业务代码逻辑上的限流.流量的限制在众多微服务和 service mesh 中多有应用.限流主要有三种算法:信 ...

  9. java服务器访问接口提示network error_北京JAVA开发三年,拿到美团35K的offer面试心得...

    前言 长文干货提示,文章为大家完整记录了一位在北京做了3年的JAVA开发的朋友,如何通过美团的面试及拿到35K的offer.全篇内容由全程电话录音再手打腾稿,原创手打不易,请记得三连支持! 文章末尾有 ...

最新文章

  1. commons-csv 使用记叙
  2. 程序员面试金典 - 面试题 01.03. URL化(字符串)
  3. Meta开发了一个AI模型,尝试解决维基百科的「性别偏见」问题
  4. 实现自适应位置--footer紧贴浏览器底部
  5. 220v转5v阻容降压电路
  6. Less的条件表达式Guards
  7. 手动安装Linux网卡驱动程序
  8. 国潮宫廷中国风文创包装品牌样机
  9. C#中跨线程操作控件
  10. 队列实现max操作,要求尽量提高效率。
  11. mysql原理以及相关优化
  12. 神舟linux装win7教程,神舟战神G70装win7系统及bios设置教程(神舟G70台式机win10改win7)...
  13. 计算机审计风险未来发展,浅谈计算机审计风险的研究
  14. 基于PHP的留言板毕业论文,网络留言板
  15. Servlet容器与Web容器详解
  16. mysql 三元_三元联系简介
  17. centos 6.5 mysql 5.5 安装,centos6.5 安装mysql-5.5
  18. Intellij idear使用心得
  19. 在微信公众号上下载视频音频的办法
  20. c语言将一个四位正整数倒排,输入一个四位正整数,将其逆序输出.如:输入1234,输出4321...

热门文章

  1. 使用Qt实现阿里云API签名
  2. 关于 VB6 透明 PNG 图像生成的一个解决方案
  3. 如何让网站在浏览器网址前面显示小图标?ico图标怎么放?
  4. 如何用Python抓网页,案例教程都总结到位了
  5. Rethinking GPS: Engineering Next-Gen Location at Uber
  6. 财管U08 公司估值 教材笔记
  7. 聚美优品启动上市,真的那么赚钱吗?
  8. windows系统进程System ntoskrnl.exe pid 4占用8080端口
  9. 【数据结构 - 栈和队列】自学笔记记录(更新中……)
  10. 采用最新闪存驱动技术 戴尔再次大幅降低企业级闪存存储成本