You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中如何结合API方法参数使用内存缓存

.NET Core分页场景下的内存缓存方案

完全可以在分页返回Employee数据的API场景中使用内存缓存,这是优化重复查询、降低数据库压力的合理方案。以下是具体实现思路和注意事项:

核心要点:缓存键的精准设计

分页请求带有页码、页大小(若有排序/筛选条件也需包含)等参数,必须用所有影响查询结果的参数生成唯一缓存键,确保不同参数组合对应不同缓存条目。例如:

var cacheKey = $"Employees_Page{page}_Size{pageSize}_SortBy{sortColumn}_Order{sortOrder}";

若参数较多,也可使用MD5等哈希算法将参数组合转换为固定长度字符串作为缓存键,避免键过长。

具体实现步骤

  1. 注册内存缓存服务
    在Program.cs中添加内存缓存服务:
builder.Services.AddMemoryCache();
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:10:59