Files
2025-12-11 09:17:16 +08:00

52 lines
1.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Threading;
namespace Common
{
public class RateLimiter
{
private static readonly object lockObject = new object();
private static readonly int requestsPerSecond = 5;//每秒允许请求5次
private static int remainingRequests;//剩余请求次数
private static long lastRequestTime;//上次请求时间
/// <summary>
/// 实现速率限制。它根据指定的每秒请求数量来控制请求是否被允许
/// </summary>
static RateLimiter()
{
remainingRequests = requestsPerSecond;
lastRequestTime = DateTime.UtcNow.Ticks;
}
/// <summary>
/// 实现速率限制默认每秒允许请求5次
/// </summary>
/// <returns></returns>
public static bool TryRequest()
{
lock (lockObject)
{
long currentTime = DateTime.UtcNow.Ticks;//当前请求时间
long elapsedTicks = currentTime - lastRequestTime;
double elapsedSeconds = elapsedTicks / TimeSpan.TicksPerSecond;
remainingRequests += (int)(elapsedSeconds * requestsPerSecond);
if (remainingRequests > requestsPerSecond)
{
remainingRequests = requestsPerSecond;
}
if (remainingRequests > 0)
{
remainingRequests--;
lastRequestTime = currentTime;
return true;
}
return false;
}
}
}
}