在高性能应用中,缓存是一种提高速度和减轻服务器压力的有力工具。说白了,它就像一块“暂存区”,用来快速提供那些经常访问、但不需要每次都重新计算或查询的数据。.NET 为我们提供了多种缓存方式,无论是简单的内存缓存、需要跨服务器共享的分布式缓存,还是用于HTTP的缓存标头,都可以满足不同场景的需求。下面,我们一起看看这些方法的实现方式。
using System; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; public class CacheService { private readonly IMemoryCache _memoryCache; public CacheService(IMemoryCache memoryCache) { _memoryCache = memoryCache; } public async Task<string> GetCachedData(string key) { // 尝试从缓存中获取数据 if (!_memoryCache.TryGetValue(key, out string cachedData)) { // 如果缓存中没有数据,则从数据源中获取 cachedData = await FetchDataFromDataSource(key); // 堆代码 duidaima.com // 将数据存入缓存,并设置过期时间为10分钟 _memoryCache.Set(key, cachedData, TimeSpan.FromMinutes(10)); } return cachedData; } private Task<string> FetchDataFromDataSource(string key) { // 模拟从数据源中获取数据 return Task.FromResult($"Data for {key}"); } }
在这里,我们先检查缓存中是否有对应的key,如果没有才从数据源获取并存入缓存。这样可以避免多次请求相同的数据,起到节省资源的作用。
using System; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Distributed; public class CacheService { private readonly IDistributedCache _distributedCache; public CacheService(IDistributedCache distributedCache) { _distributedCache = distributedCache; } public async Task<string> GetCachedData(string key) { // 从分布式缓存中获取数据 var cachedData = await _distributedCache.GetStringAsync(key); if (cachedData == null) { // 如果缓存中没有数据,则从数据源中获取 cachedData = await FetchDataFromDataSource(key); // 将数据存入缓存,并设置过期时间为10分钟 await _distributedCache.SetStringAsync(key, cachedData, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10) }); } return cachedData; } private Task<string> FetchDataFromDataSource(string key) { // 模拟从数据源中获取数据 return Task.FromResult($"Data for {key}"); } }
在这个例子中,我们首先尝试从分布式缓存中获取数据,如果没有,则从数据源获取并设置缓存项的过期时间。这种方法尤其适合于大规模分布式系统,因为不同服务器都可以访问到同一份缓存数据。
using Microsoft.AspNetCore.Mvc; public class CacheController : ControllerBase { [HttpGet("/api/data")] [ResponseCache(Duration = 60)] // 缓存60秒 public IActionResult GetData() { // 获取并返回数据 return Ok("Data"); } }
通过这种方法,客户端可以直接缓存HTTP响应,减少网络请求的频率,从而提升性能。这对一些更新频率较低的数据非常有效,比如配置文件、产品信息等。