




分析之前
依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。不要直接问月薪给多少这样的问题,这一般有HR的人会主动问你的。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行不同的限流方案。所以呢,既然针对的每个接口所以就需要一个可以标示这个接口的key(我取的是类名 方法名 入参)。
分布式限流强烈推荐使用redis lua或者nginx lua来实现。
这里用2个限流条件来做示例讲一下常见的限流算法:
接口1它10秒钟很大允许访问100次
接口2它10秒钟很大允许每个人访问100次。
计数器算法
这个算法可以说是限流算法中简单的一种算法了。
核心思想
计数器算法的意思呢就是当接口在一个时间单位中被访问时,我就记下来访问次数,直到它访问的次数到达上限。
涉及变量
接口(key)
时间单位(expire)
允许访问多少次(limit)
访问次数(value)
条件一
当一个请求过来时,我们就会得到这个key。
123456789 if(存在key){ value ; if(valuegt;=limit){ 不能访问 } }else{ 添加key,value为1 设置key过期时间为expire }

条件二
既然条件一已经实现了,那条件二会复杂么 ?
相比于条件一来说就是同一个key对应了多个用户。那么我们只需要把key加上用户的信息就可以了。比如说 key_用户1、key_用户2。
漏桶算法核心思想
漏桶算法的意思呢就是一个接口在一个时间单位中允许被访问次数是动态变化的(假如一分钟允许访问60次,那么从开始计时时不管有没有被访问第59秒只允许访问59次,30秒只允许30次)。为什么这样呢,因为有另外一个线程在进行递减操作
递减间隔时间(interval)
递减步长(step)
剩余可访问次数(value)
key的访问时间(lastUpdateTime)
当前时间(nowTime)(注意nowTime的取值应为应用取得的时间而不是redis或者nginx取得的时间)
条件一线程一:
12345678 if(存在key){ value--; if(valuelt;=0){ 不能访问 } }else{ 添加key,设置value为limit }
企业的愿景和目标。
如果面试官给了你一个非常好的愿景和目标,至少说明这家企业是个有思想、有抱负的企业。如果某个公司老板自己都说不好,5年后,他的企业会在哪里、会变成什么样?我看我还是不要进到这样的企业里了。
这些问题问得时候也得因人而异、因地制宜。如果真是双向选择,多问问没什么坏处。如果只是人家在挑我,我无论如何都想进入这家企业,那你可悠着点,别把面试官问毛了。如果真是这样,后果自负噢。