面试题答案
一键面试数据结构优化
- 使用更紧凑的数据结构:Redis 中令牌桶相关数据可考虑用
Hash
结构存储每个限流对象的状态,如剩余令牌数、令牌生成速率等,相比普通String
存储多个字段更节省空间。 - 采用有序集合(Sorted Set):若需对限流对象按某种优先级或特定规则处理,可将令牌桶相关信息存入有序集合,利用其按分数排序的特性,便于在高并发下优先处理重要请求。
集群部署
- 主从复制:搭建 Redis 主从集群,主节点负责处理写操作(如令牌生成、消耗),从节点复制主节点数据,分担读请求压力,提升系统整体吞吐量,降低单个节点负载。
- 哨兵模式:在主从复制基础上引入哨兵,哨兵持续监控主从节点状态,当主节点故障时,自动将一个从节点晋升为主节点,保证服务可用性,避免因单点故障导致限流功能失效。
- 集群分片:采用 Redis Cluster 进行数据分片,将令牌桶数据分布到多个节点上,根据哈希槽(Hash Slot)算法将请求均匀分配到不同节点,减轻单个节点存储和计算压力,提高系统扩展性,以应对每秒百万级别的流量。
算法改进
- 平滑突发限流:传统令牌桶算法在突发流量时可能导致瞬间令牌耗尽。可改进为平滑突发限流算法,例如采用双令牌桶机制,一个主令牌桶用于正常速率生成令牌,一个辅助令牌桶用于缓存一定数量的突发令牌,控制突发流量的处理节奏,提升限流精度。
- 动态调整令牌生成速率:根据系统实时负载情况动态调整令牌生成速率。通过监控服务器 CPU、内存、网络带宽等指标,当负载较低时适当提高令牌生成速率,充分利用系统资源;负载过高时降低速率,确保系统稳定。
- 基于时间窗口的限流:结合时间窗口算法,不仅基于令牌桶进行限流,还统计一定时间窗口内的请求数。当请求数达到设定阈值时,即使令牌桶中有令牌也进行限流,进一步提高限流的准确性和稳定性,避免恶意请求利用令牌桶漏洞进行攻击。