面试题答案
一键面试数据结构选择
- 哈希表(Hash Table):在Redis中,可利用哈希表存储限流相关信息,如每个用户或IP的请求计数。哈希表具有O(1)的查找和插入时间复杂度,能快速判断请求是否超出限流阈值。例如,以用户ID为键,请求计数为值,存储在哈希表中。
- 有序集合(Sorted Set):若限流规则涉及按请求频率等指标对请求源进行排序,有序集合非常合适。它可以根据分数(如请求频率)对元素进行排序。比如,可按每分钟请求次数对IP地址进行排序,方便找出高频请求源并采取更严格的限流措施。
缓存策略调整
- 动态限流阈值:摒弃固定的限流阈值,根据系统当前的负载、资源情况动态调整。可利用Redis的发布订阅功能,当系统资源(如CPU、内存利用率)达到一定阈值时,发布消息通知调整限流策略,降低限流阈值;当资源充足时,适当提高阈值,允许更多请求通过,使系统能灵活应对高并发变化。
- 分级缓存:采用多级缓存策略。除Redis外,在应用层设置本地缓存(如Guava Cache),处理一些高频且数据变动不大的请求,减轻Redis压力。对于需要实时性较高的数据,仍依赖Redis。同时,设置合理的缓存过期时间,对于限流数据,可使用较短的过期时间(如按分钟级设置),确保限流能及时更新以适应流量变化。
与其他组件协同工作
- 消息队列(MQ):引入消息队列如Kafka。当系统因限流熔断暂停部分服务时,将无法处理的请求发送到MQ中暂存。后端服务从MQ中按一定速率消费请求,进行处理,避免瞬间高并发流量直接冲击系统。例如,电商秒杀场景中,大量请求涌入时,先将请求存入MQ,再由后台服务逐步处理,防止系统崩溃。
- 负载均衡器:与负载均衡器(如Nginx)协同。负载均衡器可以根据Redis中存储的限流信息,对请求进行分流。对于超出限流的请求源,引导到特定的降级页面或返回友好的提示信息,而正常请求则均匀分配到后端多个服务实例上,提高整体系统的可用性和稳定性。