前言

最近在学习老钱的《Redis深度历险:核心原理与应用实践》,其深入浅出的讲解,让我爱不释手。其中讲到了漏斗限流,在Redis中可以使用 Redis-Cell 模块来做基于Redis的限流方案。在讲解原理的时候,老钱给出了 Python 和 Java 版的实现,看完之后发现其设计非常精妙,于是自己也根据其原理自己动手敲了一下代码,把 Java 版本的漏斗实现出来了。

实现代码

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 漏斗限流算法** @author dadiyang* @date 2018/9/28*/
public class FunnelRateLimiter {private Map<String, Funnel> funnelMap = new ConcurrentHashMap<>();public static void main(String[] args) throws InterruptedException {FunnelRateLimiter limiter = new FunnelRateLimiter();int testAccessCount = 30;int capacity = 5;int allowQuota = 5;int perSecond = 30;int allowCount = 0;int denyCount = 0;for (int i = 0; i < testAccessCount; i++) {boolean isAllow = limiter.isActionAllowed("dadiyang", "doSomething", 5, 5, 30);if (isAllow) {allowCount++;} else {denyCount++;}System.out.println("访问权限:" + isAllow);Thread.sleep(1000);}System.out.println("报告:");System.out.println("漏斗容量:" + capacity);System.out.println("漏斗流动速率:" + allowQuota + "次/" + perSecond + "秒");System.out.println("测试次数=" + testAccessCount);System.out.println("允许次数=" + allowCount);System.out.println("拒绝次数=" + denyCount);}/*** 根据给定的漏斗参数检查是否允许访问** @param username   用户名* @param action     操作* @param capacity   漏斗容量* @param allowQuota 每单个单位时间允许的流量* @param perSecond  单位时间(秒)* @return 是否允许访问*/public boolean isActionAllowed(String username, String action, int capacity, int allowQuota, int perSecond) {String key = "funnel:" + action + ":" + username;if (!funnelMap.containsKey(key)) {funnelMap.put(key, new Funnel(capacity, allowQuota, perSecond));}Funnel funnel = funnelMap.get(key);return funnel.watering(1);}private static class Funnel {private int capacity;private float leakingRate;private int leftQuota;private long leakingTs;public Funnel(int capacity, int count, int perSecond) {this.capacity = capacity;// 因为计算使用毫秒为单位的perSecond *= 1000;this.leakingRate = (float) count / perSecond;}/*** 根据上次水流动的时间,腾出已流出的空间*/private void makeSpace() {long now = System.currentTimeMillis();long time = now - leakingTs;int leaked = (int) (time * leakingRate);if (leaked < 1) {return;}leftQuota += leaked;// 如果剩余大于容量,则剩余等于容量if (leftQuota > capacity) {leftQuota = capacity;}leakingTs = now;}/*** 漏斗漏水** @param quota 流量* @return 是否有足够的水可以流出(是否允许访问)*/public boolean watering(int quota) {makeSpace();int left = leftQuota - quota;if (left >= 0) {leftQuota = left;return true;}return false;}}
}

Java实现漏斗限流算法相关推荐

  1. Redis高并发限流策略之漏斗限流算法

    在双11活动当天凌晨,打折活动开始前多少名客户下单可以半折甚至是免单优惠,客户当然不会放过这个一年一次的机会,疯狂开始.这时候我们程序员小哥哥就苦了,稍一个不注意,服务器驾崩了,次日头条见.那么为了防 ...

  2. Redis:限流算法

    一.限流算法分类 简单限流算法 漏斗限流算法(令牌桶算法) 分布式漏斗限流算法(分布式令牌桶算法) 二.简单限流算法 1. 问题引入 系统要限定用户的某个行为在指定的时间里只能允许发生 N 次,如何使 ...

  3. java redis 限流_Redis——限流算法之滑动窗口、漏斗限流的原理及java实现

    限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系统的稳定,限制恶意请求,防止因为流量暴增导致系统瘫 ...

  4. Redis(六)——限流算法:滑动时间窗口限流和漏斗限流

    本文主要总结自<redis深度历险> 限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系 ...

  5. Java 实现滑动时间窗口限流算法,你见过吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | dijia478 来源 | https://w ...

  6. Java接口限流算法

    0. 前言 常见的限流算法有:令牌桶.漏桶.计数器也可以进行粗暴限流实现. 1. 算法介绍 1.1 令牌桶算法 令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌.令牌桶算法的描述如下: ...

  7. Java 常用限流算法解析

    前言 限流作为高并发场景下抵挡流量洪峰,保护后端服务不被冲垮的一种有效手段,比如大家熟知的限流组件guawa,springcloud中的Hystrix,以及springcloud-alibaba生态中 ...

  8. java中常见的限流算法详细解析

    目录 前言 1. 验证限流以及容器限流 2. 服务端限流 2.1 固定时间窗口 2.2 滑动时间窗口 2.3 漏桶算法 2.4 令牌桶算法 前言 以下的文章参考了一些具体的资料加深了解 B站:Java ...

  9. Java中常用的限流算法

    在Java的系统中,在一些活动日或者是被黑客攻击,导致访问量突然暴增,系统承受不了巨大的流量冲击而崩溃.为了保护我们的系统,在实际开发中有四种常见的限流算法来保证系统的安全性. 1 固定窗口算法 固定 ...

最新文章

  1. Castle ActiveRecord(一)概述
  2. NIO的Buffer
  3. DRF_APIView之认证、授权配置
  4. 大庆东风中学高考成绩查询2021年,2021年大庆中考成绩和分数线什么时候公布(附查询入口)...
  5. python填充空值_Python机器学习(九十一)Pandas 填充(Imputation)空值
  6. 网络防火墙单向和双向_单向晶闸管与双向晶闸管之间的不同之处
  7. 【JavaWeb】JavaScript基础篇+高级篇
  8. pep3评估报告解读_quot;聚焦慢病、助力医改,检验项目风险评估培训计划“大兴区第四期培训班成功举办...
  9. python最新版安装图集_通过python简单的实现了plist、json图集的切割
  10. JAVA 数据类型数组
  11. 文本区域的高度随着内容增加----插件
  12. 【OpenGL】OpenGL GLUT扩展库安装与配置(Windows Visual Studio2008)
  13. ABAP 培训笔记 part 7
  14. 公司打算使用内网安全管理的软件,看了一下感觉IP-guard和Ping32两个好像不错,有需要的朋友可以参考一下
  15. Docker视频教程 之 熟悉docker-machine及docker常用命令 - 知识林
  16. 交叉编译nftables
  17. 如何进阶Java之道?首先得知道层层递进的四种软件架构
  18. 微软“黑屏”被严重误读
  19. CentOS7 安装ClamAV 进行病毒扫描查杀
  20. 有趣的歌单昵称_抖音最火的10大神曲 你的歌单里面有几首

热门文章

  1. 【震惊】富士康再次发生员工跳楼身亡 系半年来第12例
  2. 事态升级管理程序_17紧急事态升级管理程序
  3. 什么时候scanf(%d,a)中不用写
  4. 阿里大数据之-分析型数据库 AnalyticDB(技术架构及主要组件工作原理详解)
  5. HTTP SSL (HTTPS)
  6. Elasticsearch快照备份
  7. 处理2倍图片和3倍图片
  8. 核心库aud$过大清理
  9. js使用iframe引入youtube视频到页面中播放,解决跨域播放
  10. 因果推理(四):因果模型