“限流”这种事在生活中很常见,比如逢年过节时景点的限流,还有工作日的车辆单双号限流等,有人可能会问为什么要限流?我既然买了车子你还不让我上路开?还有我倒景点买了门票,景点不是能赚更多的钱吗?为什么要限流呢?
其实限流的主要目的就是为了保证整个系统的正常运行,比如以车辆限流为了,它的作用主要有两个,一个是为了保证我们生存空间的资源少受污染,尤其是近几年雾霾已经越来越严重了,如果不采取相应的手段会导致生态系统更加恶化,第二,目前车辆的增长速度已经远远的超过了市政道路的新建速度,尤其是上班的时候大家都在赶时间,如果车流量太大的话就会造成严重的交通拥堵,那么导致的直接后果就是大家上班都会迟到,为了解决这个问题所有需要限行。包括北上广深从几年前已经开始买车要摇号了,其实也是一种限流的手段,目的就是为了更好的保证我们整个系统的正常运行。
回到程序的这个层面也是一样,假设我们的系统只能为 10 万人同时提供购物服务,但是某一天因为老罗带货突然就涌进了 100 万用户,那么导致的直接后果就是服务器瘫痪,谁也甭想买东西了,所以这个时候我们需要“限流”的功能保证先让一部分用户享受购物的服务,而其他用户进行排队等待购物,这样就可以让整个系统正常的运转了。
我们本文的面试题是,使用 Redis 如何实现限流功能?
典型回答
我们可以使用 Redis 中的 ZSet(有序集合)加上滑动时间算法来实现简单的限流。所谓的滑动时间算法指的是以当前时间为截止时间,往前取一定的时间,比如往前取 60s 的时间,在这 60s 之内运行最大的访问数为 100,此时算法的执行逻辑为,先清除 60s 之前的所有请