如何将API密钥权限/配置存入内存,避免每次调用查询数据库?
API密钥权限配置的内存缓存最优设计方案
一、启动初始化加载
- 在API启动流程中(例如Program.cs的服务初始化阶段),批量拉取数据库中所有API密钥的权限配置,加载到线程安全的内存字典中。
- 字典结构采用
ConcurrentDictionary<string, ApiPermissionConfig>,Key为API密钥,Value封装允许访问的控制器/方法列表、需忽略字段集合等信息,确保多线程场景下的安全访问。 - 初始化失败时可降级加载本地预设的配置文件(如JSON),保证API服务能正常启动,后续再通过管理页同步最新配置。
二、内存缓存驱动的权限校验
- 接口请求时,从请求头或参数中提取API密钥,直接从内存字典中查询对应权限配置。
- 校验逻辑:匹配当前请求的控制器+方法是否在允许列表内;返回响应时,根据配置过滤需忽略的字段。
- 全程无数据库交互,完全基于内存操作,性能无损耗。
三、管理端配置更新接口
- 提供管理员专属的POST接口(如
/admin/api-permissions/sync),支持单条或批量更新API权限配置。 - 接口执行流程:
- 验证管理员身份(通过专属密钥或登录态)。
- 先将变更写入数据库,确认持久化成功。
- 再更新内存字典:新增/修改对应Key的配置,或删除指定Key的条目。
- 数据库写入失败时,直接返回错误,内存不做修改,避免数据不一致。
- 支持批量操作,减少管理端请求次数,提升效率。
四、数据一致性保障
- 采用先持久化、再更内存的顺序,避免内存与数据库数据不一致。
- 每日定时执行全量同步任务:从数据库拉取最新配置覆盖内存字典,处理数据库手动修改等异常场景下的不同步问题。
- 可给配置添加版本号,更新时校验版本,避免并发更新冲突。
五、细节优化
- 直接使用
ConcurrentDictionary的内置方法(TryAdd/TryUpdate/TryRemove)处理内存操作,无需手动加锁,兼顾线程安全与性能。 - 内存中的
ApiPermissionConfig设计为不可变类,避免业务逻辑中意外修改配置内容。
内容的提问来源于stack exchange,提问作者Joe Defill
相关产品推荐
相关产品推荐

