.NET8 使用缓存的几种方法,你都用过吗?

文摘   2024-11-07 07:04   广东  

在高性能应用中,缓存是一种提高速度和减轻服务器压力的有力工具。说白了,它就像一块“暂存区”,用来快速提供那些经常访问、但不需要每次都重新计算或查询的数据。.NET 8为我们提供了多种缓存方式,无论是简单的内存缓存、需要跨服务器共享的分布式缓存,还是用于HTTP的缓存标头,都可以满足不同场景的需求。下面,我们一起看看这些方法的实现方式。


一、内存缓存 (Memory Cache)

适用场景: 内存缓存适合单一服务器应用,通常用来缓存访问频繁、但实时性要求不高的数据,例如一些配置或用户信息。
原理: 内存缓存将数据直接存在服务器内存中,访问速度非常快。唯一的问题是,当服务器重启时,缓存数据会丢失。

在.NET 8中,我们可以使用MemoryCache类来实现内存缓存。下面是一个简单的实现,假设我们有一个CacheService服务类来管理缓存数据:

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<stringGetCachedData(string key)
    {
        // 尝试从缓存中获取数据
        if (!_memoryCache.TryGetValue(key, out string cachedData))
        {
            // 如果缓存中没有数据,则从数据源中获取
            cachedData = await FetchDataFromDataSource(key);

            // 将数据存入缓存,并设置过期时间为10分钟
            _memoryCache.Set(key, cachedData, TimeSpan.FromMinutes(10));
        }
        return cachedData;
    }

    private Task<stringFetchDataFromDataSource(string key)
    {
        // 模拟从数据源中获取数据
        return Task.FromResult($"Data for {key}");
    }
}

在这里,我们先检查缓存中是否有对应的key,如果没有才从数据源获取并存入缓存。这样可以避免多次请求相同的数据,起到节省资源的作用。


二、分布式缓存 (Distributed Cache)

适用场景: 如果你的应用需要部署在多台服务器上,分布式缓存就派上用场了。它让不同服务器之间可以共享缓存的数据,这样用户在不同服务器上访问时也能得到一致的缓存结果。
原理: 分布式缓存将数据存储在一个“外部的缓存服务”中,比如Redis或SQL Server。

在.NET 8中,我们可以使用IDistributedCache接口来实现分布式缓存。下面是一个示例代码,演示如何使用IDistributedCache来获取和存储数据:

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<stringGetCachedData(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<stringFetchDataFromDataSource(string key)
    {
        // 模拟从数据源中获取数据
        return Task.FromResult($"Data for {key}");
    }
}

在这个例子中,我们首先尝试从分布式缓存中获取数据,如果没有,则从数据源获取并设置缓存项的过期时间。这种方法尤其适合于大规模分布式系统,因为不同服务器都可以访问到同一份缓存数据。


三、HTTP缓存

适用场景: HTTP缓存主要用于减少服务器和客户端之间的网络流量,提升页面加载速度。常见于API接口和Web页面的响应缓存。
原理: HTTP缓存通过设置HTTP标头(例如Cache-ControlExpires)来告知浏览器可以在本地缓存数据,并指定缓存的时长。

在.NET 8中,我们可以通过控制器中的ResponseCache属性来设置HTTP缓存。例如,以下代码将在服务器返回的数据上设置缓存标头,使客户端在接下来的60秒内都能从缓存中获取数据,而无需重新请求:

using Microsoft.AspNetCore.Mvc;

public class CacheController : ControllerBase
{
    [HttpGet("/api/data")]
    [ResponseCache(Duration = 60)// 缓存60秒
    public IActionResult GetData()
    {
        // 获取并返回数据
        return Ok("Data");
    }
}

通过这种方法,客户端可以直接缓存HTTP响应,减少网络请求的频率,从而提升性能。这对一些更新频率较低的数据非常有效,比如配置文件、产品信息等。


总结

在.NET 8中,缓存已经不再是一种“可有可无”的技术,而是成为了性能优化中至关重要的一环。从简单的内存缓存,到适用于分布式系统的分布式缓存,再到HTTP缓存标头,各种缓存方式的配合可以让应用程序更加高效。在实际开发中,我们需要根据具体的应用场景和需求来选择合适的缓存方式,从而找到性能和资源使用的最佳平衡点。当然还有其它三方开源缓存方式,大家可以在github上找找。

希望这些方法能帮助你在开发中更好地利用缓存技术,为用户带来更流畅的体验。


关注公众号DotNet开发跳槽    

追逐时光者
DotNetGuide官方公众号,微软MVP,专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。
 最新文章