基本信息
文件名称:使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力.docx
文件大小:19.13 KB
总页数:9 页
更新时间:2025-05-22
总字数:约5.28千字
文档摘要

使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力

使用场景是需要使用一个接口,这个接口有限制每个APIKey的请求量在5次/s

一开始是最苯的做法,每次调用之后等个200毫秒,这样就不会超出这个限制

但是这样效率也太低了,刚好发现我们拥有不少APIKey,那么直接改成并发的吧,安排!

本文做一个简单的记录

将每个APIKey的调用情况保存在内存里

C#提供的MemoryCache组件是个key-value结构,并且可以设置每个值的过期时间

我把APIKey作为key存入,value则是已使用的次数,并设置过期时间为1秒

这样只需要判断某个APIKey的使用次数是否小于5,小于5就拿来用,大于5就读取配置拿新一个的APIKey。

使用fluent-console

fluent-console是我之前开发的C#Console应用模板,提供「现代化的控制台应用的开发体验」脚手架,能像Web应用那样很优雅地整合各种组件,包括依赖注入、配置、日志等功能。

项目地址:/Deali-Axy/fluent-dotnet-console

本文需要用到MemoryCache等组件,用这个模板会比较方便,首先使用这个模板创建一个项目

#安装模板

dotnetnewinstallFluentConsole.Templates

创建项目

dotnetnewflu-cli-nMyProject

准备配置文件

在配置文件里准备好APIKeys

编辑项目的appsettings.json

Logging:{

LogLevel:{

Default:Debug

AppSettings:{

Name:Thenameofthisappisfluentconsoledemo,

Boolean:true,

DemoList:[

item1,

item2,

item3

ApiKeys:[

apikey-xxx,

apikey-xxx,

apikey-xxx,

apikey-xxx,

apikey-xxx,

apikey-xxx,

apikey-xxx,

apikey-xxx

fluent-console模板已经处理好了配置相关的逻辑,后续直接使用即可

编辑Program.cs文件

添加需要的服务

services.AddMemoryCache();

services.AddScopedApiService

等下来ApiService里写代码

ApiService

在Services文件夹下创建ApiService.cs文件

先把依赖注入进来

usingFlurl;

usingFlurl.Http;

usingMicrosoft.Extensions.Caching.Memory;

usingMicrosoft.Extensions.Logging;

usingMicrosoft.Extensions.Options;

namespaceMyProject.Services;

publicclassApiService{

privatereadonlyILoggerApiService_logger;

privatereadonlyAppSettings_settings;

privatereadonlyIMemoryCache_cache;

publicApiService(IOptionsAppSettingsappOptions,IMemoryCachecache,ILoggerApiServicelogger){

_cache=cache;

_logger=logger;

_settings=appOptions.Value;

封装keys管理

这里写了一个方法来获取一个可用的APIKey

因为需要考虑并发运行,对_cache对象加锁

思路很简单上面已经介绍了,直接写成代码,同时写了很清楚的注释

privatestringGetNextApiKey(){

lock(_cache){

foreach(var