域名IP关系缓存10分钟

This commit is contained in:
老九 2021-11-20 11:27:00 +08:00
parent 6d3668adc2
commit 795970c1b1

View File

@ -13,26 +13,27 @@ using System.Threading.Tasks;
namespace FastGithub.DomainResolve namespace FastGithub.DomainResolve
{ {
/// <summary> /// <summary>
/// IP状态服务 /// IP服务
/// 状态缓存5分钟 /// 域名IP关系缓存10分钟
/// 连接超时5秒 /// IPEndPoint时延缓存5分钟
/// IPEndPoint连接超时5秒
/// </summary> /// </summary>
sealed class IPAddressService sealed class IPAddressService
{ {
private record DomainAddress(string Domain, IPAddress Address); private record DomainAddress(string Domain, IPAddress Address);
private readonly TimeSpan domainExpiration = TimeSpan.FromMinutes(5d); private readonly TimeSpan domainAddressExpiration = TimeSpan.FromMinutes(10d);
private readonly IMemoryCache domainAddressCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); private readonly IMemoryCache domainAddressCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
private record AddressElapsed(IPAddress Address, TimeSpan Elapsed); private record AddressElapsed(IPAddress Address, TimeSpan Elapsed);
private readonly TimeSpan brokeExpiration = TimeSpan.FromMinutes(1d); private readonly TimeSpan brokeElapsedExpiration = TimeSpan.FromMinutes(1d);
private readonly TimeSpan normalExpiration = TimeSpan.FromMinutes(5d); private readonly TimeSpan normaleElapsedExpiration = TimeSpan.FromMinutes(5d);
private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d); private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d);
private readonly IMemoryCache addressElapsedCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); private readonly IMemoryCache addressElapsedCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
private readonly DnsClient dnsClient; private readonly DnsClient dnsClient;
/// <summary> /// <summary>
/// IP状态服务 /// IP服务
/// </summary> /// </summary>
/// <param name="dnsClient"></param> /// <param name="dnsClient"></param>
public IPAddressService(DnsClient dnsClient) public IPAddressService(DnsClient dnsClient)
@ -66,7 +67,7 @@ namespace FastGithub.DomainResolve
{ {
ipEndPoints.Add(new IPEndPoint(address, dnsEndPoint.Port)); ipEndPoints.Add(new IPEndPoint(address, dnsEndPoint.Port));
var domainAddress = new DomainAddress(dnsEndPoint.Host, address); var domainAddress = new DomainAddress(dnsEndPoint.Host, address);
this.domainAddressCache.Set(domainAddress, default(object), this.domainExpiration); this.domainAddressCache.Set(domainAddress, default(object), this.domainAddressExpiration);
} }
if (ipEndPoints.Count == 0) if (ipEndPoints.Count == 0)
@ -107,14 +108,14 @@ namespace FastGithub.DomainResolve
await socket.ConnectAsync(endPoint, linkedTokenSource.Token); await socket.ConnectAsync(endPoint, linkedTokenSource.Token);
addressElapsed = new AddressElapsed(endPoint.Address, stopWatch.Elapsed); addressElapsed = new AddressElapsed(endPoint.Address, stopWatch.Elapsed);
return this.addressElapsedCache.Set(endPoint, addressElapsed, this.normalExpiration); return this.addressElapsedCache.Set(endPoint, addressElapsed, this.normaleElapsedExpiration);
} }
catch (Exception) catch (Exception)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
addressElapsed = new AddressElapsed(endPoint.Address, TimeSpan.MaxValue); addressElapsed = new AddressElapsed(endPoint.Address, TimeSpan.MaxValue);
var expiration = NetworkInterface.GetIsNetworkAvailable() ? this.normalExpiration : this.brokeExpiration; var expiration = NetworkInterface.GetIsNetworkAvailable() ? this.normaleElapsedExpiration : this.brokeElapsedExpiration;
return this.addressElapsedCache.Set(endPoint, addressElapsed, expiration); return this.addressElapsedCache.Set(endPoint, addressElapsed, expiration);
} }
finally finally