.NET Core中如何结合API方法参数使用内存缓存
.NET Core分页场景下的内存缓存方案
完全可以在分页返回Employee数据的API场景中使用内存缓存,这是优化重复查询、降低数据库压力的合理方案。以下是具体实现思路和注意事项:
核心要点:缓存键的精准设计
分页请求带有页码、页大小(若有排序/筛选条件也需包含)等参数,必须用所有影响查询结果的参数生成唯一缓存键,确保不同参数组合对应不同缓存条目。例如:
var cacheKey = $"Employees_Page{page}_Size{pageSize}_SortBy{sortColumn}_Order{sortOrder}";
若参数较多,也可使用MD5等哈希算法将参数组合转换为固定长度字符串作为缓存键,避免键过长。
具体实现步骤
- 注册内存缓存服务
在Program.cs中添加内存缓存服务:
builder.Services.AddMemoryCache();
- 在API中注入并使用缓存
在Controller方法中注入IMemoryCache,优先从缓存读取数据,未命中则查询数据库并写入缓存:
[HttpGet] public async Task<IActionResult> GetEmployees(int page = 1, int pageSize = 10) { var cacheKey = $"Employees_Page{page}_Size{pageSize}"; // 尝试从缓存获取数据 if (!_cache.TryGetValue(cacheKey, out PaginatedResult<Employee> cachedData)) { // 缓存未命中,执行数据库查询与分页处理 var allEmployees = await _employeeRepository.GetAllAsync(); var paginatedData = allEmployees.Skip((page - 1) * pageSize).Take(pageSize).ToList(); cachedData = new PaginatedResult<Employee> { Data = paginatedData, TotalCount = allEmployees.Count, Page = page, PageSize = pageSize }; // 设置缓存过期策略:绝对过期10分钟+滑动过期5分钟 var cacheOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromMinutes(10)) .SetSlidingExpiration(TimeSpan.FromMinutes(5)); // 将分页结果存入缓存 _cache.Set(cacheKey, cachedData, cacheOptions); } return Ok(cachedData); }
(注:PaginatedResult为自定义分页结果类,包含数据列表、总条数、页码等信息)
关键注意事项
- 缓存过期策略:根据数据更新频率设置过期时间。若Employee数据更新不频繁,可延长绝对过期时间;若更新频繁,建议缩短过期时间,或结合滑动过期清理闲置缓存。
- 数据更新时的缓存失效:当Employee数据发生增、删、改操作时,必须清理相关缓存条目,避免返回旧数据。例如在更新方法中批量删除相关缓存键:
// 清理所有Employee分页缓存(需自定义GetKeys扩展方法遍历缓存键) var cacheEntries = _cache.GetKeys().Where(k => k.StartsWith("Employees_")); foreach (var key in cacheEntries) { _cache.Remove(key); }
- 避免缓存击穿:若某分页缓存过期时遭遇大量并发请求,可能瞬间压垮数据库。可通过
SemaphoreSlim锁机制,确保同一缓存键仅一个请求去查询数据库,其余请求等待缓存写入后再读取。
内容的提问来源于stack exchange,提问作者Malin
相关产品推荐
相关产品推荐

