52 lines
1.6 KiB
C#
52 lines
1.6 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|