0Pricing
C# Academy · 课时

IDistributedCache 抽象

在多台服务器之间缓存数据。

IDistributedCache 抽象 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

为什么要使用分布式缓存

内存缓存存在于单个进程中,因此重启后会丢失,也不会在多个服务器之间共享。分布式缓存存在于外部存储中(例如 Redis),应用的每个实例都可以读写该存储,从而使缓存内容在横向扩展的部署中保持一致。

IDistributedCache 接口

ASP.NET Core 在 Microsoft.Extensions.Caching.Distributed 中通过 IDistributedCache 对分布式缓存进行了抽象。您的代码依赖这个接口,而不是直接依赖 Redis,因此可以替换具体实现。

public interface IDistributedCache
{
    byte[] Get(string key);
    Task<byte[]> GetAsync(string key, CancellationToken token = default);
    void Set(string key, byte[] value, DistributedCacheEntryOptions options);
    void Remove(string key);
    void Refresh(string key);
}

它存储字节

请注意,缓存存储的是 byte[]。要缓存字符串或对象,必须先将其序列化。针对常见情况,框架还提供了便捷的字符串扩展方法。

using Microsoft.Extensions.Caching.Distributed;

await cache.SetStringAsync("greeting", "Hello, world");
string value = await cache.GetStringAsync("greeting");

注入缓存

像请求任何服务一样,通过构造函数注入 IDistributedCache。

public class WeatherService
{
    private readonly IDistributedCache _cache;
    public WeatherService(IDistributedCache cache)
    {
        _cache = cache;
    }
}

从缓存读取

当键不存在或已过期时,GetStringAsync 会返回 null。请始终处理未命中情况。

string cached = await _cache.GetStringAsync("forecast:istanbul");
if (cached is null)
{
    // cache miss: load from source
}

写入缓存

SetStringAsync 会使用可选的过期 options(选项)存储值(后续课程会介绍)。

await _cache.SetStringAsync(
    "forecast:istanbul",
    "22C sunny",
    new DistributedCacheEntryOptions
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
    });

移除与刷新

RemoveAsync 会逐出一个键对应的条目(例如底层数据发生变化时)。RefreshAsync 会在不改变值的情况下重置滑动过期时间。

await _cache.RemoveAsync("forecast:istanbul");
await _cache.RefreshAsync("session:abc123");

内存实现

在开发或测试时,请注册内存分布式缓存。它实现了相同的接口,因此您的代码完全相同,但数据实际上不会在进程之间共享。

builder.Services.AddDistributedMemoryCache();

与提供程序无关的代码

由于您只依赖 IDistributedCache,从内存提供程序切换到 Redis(或 SQL Server)只需更改一行注册代码,无需修改服务中的代码。

键命名约定

请使用结构化的带命名空间的键,例如 entity:id:field(如 user:42:profile)。清晰的约定可以防止冲突,并使缓存失效过程变得可预测。

string key = $"user:{userId}:profile";

不应缓存的情况

应缓存经常读取且很少变化的数据。高度易变的数据或特定用户的敏感数据可能不适合缓存,并且始终要权衡数据过时的风险与性能收益。

快速检查

测试 IDistributedCache 抽象。

总结

IDistributedCache 对外部共享缓存进行了抽象,因此每个应用实例都能看到相同的数据。它存储 byte[],并提供用于字符串的 GetStringAsync/SetStringAsync,以及 RemoveAsync 和 RefreshAsync。依赖该接口可以让代码与提供程序无关,并可在 AddDistributedMemoryCache 和 Redis 之间切换,只需修改一行代码。请使用清晰的带命名空间的键。

常见问题解答

「IDistributedCache 抽象」课时是免费的吗?

是的 — 「IDistributedCache 抽象」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「IDistributedCache 抽象」这节课中我会学到什么?

在多台服务器之间缓存数据。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「IDistributedCache 抽象」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. IDistributedCache 抽象
  2. 连接 Redis
  3. 缓存模式与过期
  4. 缓存序列化对象
← 返回 C# Academy