C# 实现简单的接口限流工具(令牌桶算法)

简介: 基于令牌桶算法实现接口限流,通过控制令牌生成速率与桶容量,防止高频请求压垮服务,适用于Web及后端系统,保障接口稳定。

基于令牌桶算法实现接口限流,防止接口被高频请求压垮,适用于 Web 和服务端项目。
using System.Threading;

public class TokenBucketLimiter
{
// 令牌桶容量
private readonly int _capacity;
// 令牌生成速率(每秒生成多少个)
private readonly double _tokenRatePerSecond;
// 当前令牌数
private double _currentTokens;
// 上次生成令牌的时间
private DateTime _lastRefillTime;
private readonly object _lockObj = new();

public TokenBucketLimiter(int capacity, double tokenRatePerSecond)
{
    _capacity = capacity;
    _tokenRatePerSecond = tokenRatePerSecond;
    _currentTokens = capacity;
    _lastRefillTime = DateTime.Now;
}

// 尝试获取令牌
public bool TryAcquire(int tokens = 1)
{
    lock (_lockObj)
    {
        // 补充令牌
        RefillTokens();

        if (_currentTokens >= tokens)
        {
            _currentTokens -= tokens;
            return true;
        }
        return false;
    }
}

// 补充令牌
private void RefillTokens()
{
    var now = DateTime.Now;
    var elapsedSeconds = (now - _lastRefillTime).TotalSeconds;
    var newTokens = elapsedSeconds * _tokenRatePerSecond;

    _currentTokens = Math.Min(_currentTokens + newTokens, _capacity);
    _lastRefillTime = now;
}

// 调用示例
public static void TestLimiter()
{
    // 容量10,每秒生成5个令牌
    var limiter = new TokenBucketLimiter(10, 5);

    for (int i = 0; i < 20; i++)
    {
        var canAccess = limiter.TryAcquire();
        Console.WriteLine($"请求{i + 1}: {(canAccess ? "成功" : "限流")}");
        Thread.Sleep(100);
    }
}

}

相关文章
|
2天前
|
安全 C#
C# 泛型:实现类型安全的通用代码
泛型通过类型参数(如T)实现类型通用性,可定义不指定具体类型的类或方法,使用时再确定类型。示例中,Swap&lt;T&gt;方法可交换任意同类型变量,List&lt;T&gt;集合避免装箱拆箱,提升性能与安全。
|
2天前
|
存储 安全 C#
C# 数组与集合:List<T> 最常用场景
数组长度固定,集合(List&lt;T&gt;)可动态增删,支持泛型与类型安全。常用操作包括添加、删除、遍历和查询元素,是开发中首选的动态数据存储方式。
|
2天前
|
存储 缓存 安全
C# 实现带过期时间的本地缓存工具
基于ConcurrentDictionary与定时清理机制,实现线程安全的本地缓存,支持键值过期自动清除。每分钟扫描并移除过期项,有效防止内存溢出,适用于需短暂存储数据的场景,如用户会话、临时配置等,保障性能与稳定性。
|
2天前
|
C# 索引
C# 循环结构:for/foreach/while 效率对比
循环用于重复执行代码,根据场景选择:for 适合已知次数,foreach 简洁遍历集合,while 适用于条件控制。示例演示遍历商品价格列表并计算总和,展示三种循环的用法与差异。(239字)
|
2天前
|
网络协议 安全 C#
C# 实现基于 TCP 的简单聊天程序(服务端)
基于TcpListener实现TCP聊天服务器,监听指定端口,接收客户端连接并实时转发消息。支持多客户端并发通信,新连接自动加入广播列表,断开后自动移除,确保线程安全与稳定运行。
|
2天前
|
安全 C# 数据安全/隐私保护
C# 实现验证码 + 登录的整合案例
整合图形验证码与用户登录功能,实现安全的登录验证流程。系统生成验证码图片并校验输入,结合用户名密码双重验证,提升账户安全性,有效防止自动化攻击。
|
2天前
|
存储 C#
C# 实现简单的备忘录模式
备忘录模式在不破坏封装性的前提下,捕获并保存对象的内部状态,以便后续恢复。通过原发器创建备忘录,管理者存储备忘录,可实现状态回滚。
|
2天前
|
C#
C# 条件判断:if-else 与 switch 的实用场景
条件判断是流程控制的核心。if-else适用于多级条件判断,如根据积分决定会员等级;switch适用于多值匹配,C# 7.0+支持字符串和数值匹配,可清晰处理会员等级对应的优惠策略。
|
2天前
|
C#
52. C# 实现简单的责任链模式
通过责任链模式将请求的发送者与接收者解耦,多个处理器形成链式结构,依次处理不同请求。每个处理器可自行处理或传递给下一节点,提升灵活性与扩展性。
|
2天前
|
安全 C#
C# 实现简单的单例模式(懒汉式)
单例模式确保一个类仅存在一个实例,并提供全局访问点。通过私有构造函数防止外部实例化,结合静态属性和延迟初始化实现线程安全的唯一实例,常用于日志、配置管理等场景。

热门文章

最新文章